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 2016/08/25 03:07:48 UTC

svn commit: r1757594 [2/3] - in /openmeetings/application: branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ branc...

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.html?rev=1757594&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.html (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.html Thu Aug 25 03:07:48 2016
@@ -0,0 +1,59 @@
+<?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:head>
+	<script type="text/javascript">
+		function showBusyIndicator() {
+			$('#busy_indicator').show();
+		}
+		function hideBusyIndicator() {
+			$('#busy_indicator').hide();
+		}
+	</script>
+</wicket:head>
+<wicket:panel>
+	<script type="text/javascript">
+		$(function() {
+			Wicket.Event.subscribe('/ajax/call/failure', hideBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/before', showBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/success', hideBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/complete', hideBusyIndicator);
+		});
+	</script>
+	<div wicket:id="topControls">
+		<div wicket:id="topLinks"><span 
+			id="contactsAndMessages"><a wicket:id="messages"><wicket:message key="1188"/></a></span><span 
+			id="profile"><a wicket:id="profile"><wicket:message key="5"/></a></span><span 
+			id="logout"><a wicket:id="logout" href="#"><wicket:message key="310"/></a></span><span 
+			id="reportBug"><a target="_blank" href="https://issues.apache.org/jira/browse/OPENMEETINGS"><wicket:message key="284"/></a></span><span><a 
+			wicket:id="about"><wicket:message key="1549"/></a></span>
+		</div>
+		<div id="busy_indicator" class="ui-widget-header"><span><wicket:message key="1554"/></span></div>
+		<div wicket:id="menu"></div>
+	</div>
+	<div wicket:id="dev" id="devMenu"/>
+	<div wicket:id="contents"><div wicket:id="child"></div></div>
+	<div wicket:id="chatPanel"></div>
+	<div wicket:id="aboutDialog"></div>
+	<div wicket:id="userInfoDialog"></div>
+	<div wicket:id="newMessageDialog"></div>
+</wicket:panel>
+</html>

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java?rev=1757594&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java Thu Aug 25 03:07:48 2016
@@ -0,0 +1,301 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.common;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.web.app.Application.addOnlineUser;
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.removeOnlineUser;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
+import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getParam;
+import static org.apache.openmeetings.web.util.OmUrlFragment.CHILD_ID;
+import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_EDIT;
+import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES;
+import static org.apache.openmeetings.web.util.OmUrlFragment.getPanel;
+import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.basic.NavigationDao;
+import org.apache.openmeetings.db.entity.basic.Naviglobal;
+import org.apache.openmeetings.db.entity.basic.Navimain;
+import org.apache.openmeetings.db.entity.user.PrivateMessage;
+import org.apache.openmeetings.db.util.AuthLevelUtil;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.openmeetings.web.common.menu.MainMenuItem;
+import org.apache.openmeetings.web.common.menu.MenuItem;
+import org.apache.openmeetings.web.common.menu.MenuPanel;
+import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.openmeetings.web.room.menu.RoomMenuPanel;
+import org.apache.openmeetings.web.user.AboutDialog;
+import org.apache.openmeetings.web.user.ChatPanel;
+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;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
+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.devutils.debugbar.DebugBar;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.PriorityHeaderItem;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.EmptyPanel;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
+import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
+import org.apache.wicket.protocol.ws.api.message.AbstractClientMessage;
+import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
+import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.wicketstuff.urlfragment.UrlFragment;
+
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem;
+
+public class MainPanel extends Panel {
+	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(MainPanel.class, webAppRootKey);
+	public final static String PARAM_USER_ID = "userId";
+	private Client client;
+	private final MenuPanel menu;
+	private final WebMarkupContainer topControls = new WebMarkupContainer("topControls");
+	private final WebMarkupContainer topLinks = new WebMarkupContainer("topLinks");
+	private final MarkupContainer contents;
+	private final ChatPanel chat;
+	private final MessageDialog newMessage;
+	private final UserInfoDialog userInfo;
+
+	public MainPanel(String id) {
+		this(id, new WebMarkupContainer(CHILD_ID));
+	}
+
+	public MainPanel(String id, WebMarkupContainer panel) {
+		super(id);
+		client = new Client(getSession().getId(), getUserId());
+		add(topControls.setOutputMarkupPlaceholderTag(true).setMarkupId("topControls"));
+		menu = new MenuPanel("menu", getMainMenu());
+		contents = new WebMarkupContainer("contents");
+		add(contents.add(panel).setOutputMarkupId(true).setMarkupId("contents"));
+		topControls.add(menu.setVisible(false), topLinks.setVisible(false).setOutputMarkupPlaceholderTag(true).setMarkupId("topLinks"));
+		topLinks.add(new AjaxLink<Void>("messages") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				updateContents(PROFILE_MESSAGES, target);
+			}
+		});
+		topLinks.add(new ConfirmableAjaxBorder("logout", getString("310"), getString("634")) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+				getSession().invalidate();
+				setResponsePage(Application.get().getSignInPageClass());
+			}
+		});
+		topLinks.add(new AjaxLink<Void>("profile") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				updateContents(PROFILE_EDIT, target);
+			}
+		});
+		final AboutDialog about = new AboutDialog("aboutDialog");
+		topLinks.add(new AjaxLink<Void>("about") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				about.open(target);
+			}
+		});
+		if (getApplication().getDebugSettings().isDevelopmentUtilitiesEnabled()) {
+			add(new DebugBar("dev").setOutputMarkupId(true));
+		} else {
+			add(new EmptyPanel("dev").setVisible(false));
+		}
+		add(about, chat = new ChatPanel("chatPanel"));
+		add(newMessage = new MessageDialog("newMessageDialog", new CompoundPropertyModel<PrivateMessage>(new PrivateMessage())) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
+				BasePanel bp = getCurrentPanel();
+				if (send.equals(button) && bp != null) {
+					bp.onNewMessageClose(handler);
+				}
+			}
+		});
+		add(userInfo = new UserInfoDialog("userInfoDialog", newMessage));
+		add(new AbstractDefaultAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void respond(AjaxRequestTarget target) {
+				userInfo.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("showUserInfo", this, explicit(PARAM_USER_ID)), "showUserInfo")));
+			}
+		});
+		add(new AbstractDefaultAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void respond(AjaxRequestTarget target) {
+				ContactsHelper.addUserToContactList(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("addContact", this, explicit(PARAM_USER_ID)), "addContact")));
+			}
+		});
+		add(new AbstractDefaultAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void respond(AjaxRequestTarget target) {
+				newMessage.reset(true).open(target, getParam(getComponent(), PARAM_USER_ID).toOptionalLong());
+			}
+			
+			@Override
+			public void renderHead(Component component, IHeaderResponse response) {
+				super.renderHead(component, response);
+				response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("privateMessage", this, explicit(PARAM_USER_ID)), "privateMessage")));
+			}
+		});
+		add(new WebSocketBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onConnect(ConnectedMessage message) {
+				super.onConnect(message);
+				addOnlineUser(client.setPageId(message.getKey()));
+				log.debug("WebSocketBehavior::onConnect [uid: {}, session: {}, key: {}]", client.getUid(), message.getSessionId(), message.getKey());
+			}
+			
+			@Override
+			protected void onAbort(AbortedMessage message) {
+				super.onAbort(message);
+				closeHandler(message);
+			}
+			
+			@Override
+			protected void onClose(ClosedMessage message) {
+				super.onClose(message);
+				closeHandler(message);
+			}
+			
+			private void closeHandler(AbstractClientMessage message) {
+				if (MainPanel.this.getCurrentPanel() instanceof RoomPanel) {
+					RoomPanel rp = (RoomPanel)MainPanel.this.getCurrentPanel();
+					RoomMenuPanel.roomExit(rp);
+				}
+				removeOnlineUser(client);
+				log.debug("WebSocketBehavior::closeHandler [uid: {}, session: {}, key: {}]", client.getUid(), message.getSessionId(), message.getKey());
+			}
+		});
+	}
+
+	private List<IMenuItem> getMainMenu() {
+		List<IMenuItem> menu = new ArrayList<>();
+		for (Naviglobal gl : getBean(NavigationDao.class).getMainMenu(AuthLevelUtil.hasAdminLevel(WebSession.getRights()))) {
+			List<IMenuItem> l = new ArrayList<>();
+			for (Navimain nm : gl.getMainnavi()) {
+				l.add(new MainMenuItem(nm) {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					public void onClick(AjaxRequestTarget target) {
+						onClick(MainPanel.this, target);
+					}
+				}); 
+			}
+			menu.add(new MenuItem(Application.getString(gl.getLabelId()), l));
+		}
+		return menu;
+	}
+
+	public void updateContents(OmUrlFragment f, IPartialPageRequestHandler handler) {
+		updateContents(f, handler, true);
+	}
+
+	private BasePanel getCurrentPanel() {
+		Component prev = contents.get(CHILD_ID);
+		if (prev != null && prev instanceof BasePanel) {
+			return (BasePanel)prev;
+		}
+		return null;
+	}
+
+	public void updateContents(OmUrlFragment f, IPartialPageRequestHandler handler, boolean updateFragment) {
+		BasePanel panel = getPanel(f.getArea(), f.getType());
+		if (panel != null) {
+			BasePanel prev = getCurrentPanel();
+			if (prev != null) {
+				prev.cleanup(handler);
+			}
+			handler.add(contents.replace(panel));
+			if (updateFragment) {
+				UrlFragment uf = new UrlFragment(handler);
+				uf.set(f.getArea().name(), f.getType());
+			}
+			panel.onMenuPanelLoad(handler);
+		}
+	}
+
+	public MenuPanel getMenu() {
+		return menu;
+	}
+
+	public WebMarkupContainer getTopLinks() {
+		return topLinks;
+	}
+
+	public WebMarkupContainer getTopControls() {
+		return topControls;
+	}
+
+	public ChatPanel getChat() {
+		return chat;
+	}
+
+	public Client getClient() {
+		return client;
+	}
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MainMenuItem.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MainMenuItem.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MainMenuItem.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MainMenuItem.java Thu Aug 25 03:07:48 2016
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.comm
 
 import org.apache.openmeetings.db.entity.basic.Navimain;
 import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.pages.MainPage;
+import org.apache.openmeetings.web.common.MainPanel;
 import org.apache.openmeetings.web.util.OmUrlFragment;
 import org.apache.openmeetings.web.util.OmUrlFragment.MenuActions;
 import org.apache.openmeetings.web.util.OmUrlFragment.MenuParams;
@@ -37,7 +37,7 @@ public class MainMenuItem extends MenuIt
 		params = m.getParams() != null ? MenuParams.valueOf(m.getParams()) : MenuParams.publicTabButton;
 	}
 	
-	public void onClick(MainPage page, AjaxRequestTarget target) {
-		page.updateContents(new OmUrlFragment(action, params), target);
+	public void onClick(MainPanel main, AjaxRequestTarget target) {
+		main.updateContents(new OmUrlFragment(action, params), target);
 	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/AccessDeniedPage.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/AccessDeniedPage.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/AccessDeniedPage.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/AccessDeniedPage.java Thu Aug 25 03:07:48 2016
@@ -46,7 +46,7 @@ public class AccessDeniedPage extends Ba
 
 					@Override
 					public boolean isVisible() {
-						return !WebSession.get().isSignedIn();
+						return WebSession.get().isSignedIn();
 					}
 
 					@Override

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.html?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.html (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.html Thu Aug 25 03:07:48 2016
@@ -27,7 +27,7 @@
 		</div>
 		<div wicket:id="i-pass"></div>
 	</div>
-	<div wicket:id="panel-swf" style="width: 100%; height: 100%;"></div>
+	<div wicket:id="panel-main" style="width: 100%; height: 100%;"></div>
 	<div wicket:id="access-denied"></div>
 </wicket:extend>
 </html>

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java Thu Aug 25 03:07:48 2016
@@ -19,24 +19,30 @@
 package org.apache.openmeetings.web.pages;
 
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.WebSession.WICKET_ROOM_ID;
 import static org.apache.openmeetings.web.app.WebSession.getRecordingId;
 import static org.apache.openmeetings.web.room.SwfPanel.SWF;
 import static org.apache.openmeetings.web.room.SwfPanel.SWF_TYPE_NETWORK;
 import static org.apache.openmeetings.web.room.SwfPanel.SWF_TYPE_SETTINGS;
+import static org.apache.openmeetings.web.util.OmUrlFragment.CHILD_ID;
 
 import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.openmeetings.db.entity.room.Invitation.Valid;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.IUpdatable;
+import org.apache.openmeetings.web.common.MainPanel;
+import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.SwfPanel;
 import org.apache.openmeetings.web.user.record.VideoInfo;
 import org.apache.openmeetings.web.user.record.VideoPlayer;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 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.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.EmptyPanel;
 import org.apache.wicket.request.IRequestParameters;
@@ -52,13 +58,15 @@ import com.googlecode.wicket.jquery.ui.w
 public class HashPage extends BaseInitedPage implements IUpdatable {
 	private static final long serialVersionUID = 1L;
 	public static final String SECURE_HASH = "secureHash";
+	public static final String PANEL_MAIN = "panel-main";
 	public static final String INVITATION_HASH = "invitationHash";
 	private static final String HASH = "hash";
 	private final WebMarkupContainer recContainer = new WebMarkupContainer("panel-recording");
 	private final VideoInfo vi = new VideoInfo("info", null);
 	private final VideoPlayer vp = new VideoPlayer("player", null);
 	private String errorKey = "invalid.hash";
-	private boolean error = true;;
+	private boolean error = true;
+	private Long roomId;
 
 	public HashPage(PageParameters p) {
 		StringValue secure = p.get(SECURE_HASH);
@@ -71,7 +79,7 @@ public class HashPage extends BaseInited
 		ws.checkHashes(secure, invitation);
 
 		recContainer.setVisible(false);
-		add(new EmptyPanel("panel-swf").setVisible(false));
+		add(new EmptyPanel(PANEL_MAIN).setVisible(false));
 		if (!invitation.isEmpty()) {
 			Invitation i = ws.getInvitation();
 			if (i == null) {
@@ -91,13 +99,12 @@ public class HashPage extends BaseInited
 				}
 				Room r = i.getRoom();
 				if (r != null) {
-					replace(new SwfPanel("panel-swf", new PageParameters(p).add(WICKET_ROOM_ID, r.getId())));
+					createRoom(r.getId());
 				}
-				error = false;
 			}
 		} else if (!secure.isEmpty()) {
-			Long recId = getRecordingId();
-			if (recId == null && ws.getRoomId() == null) {
+			Long recId = getRecordingId(), roomId = ws.getRoomId();
+			if (recId == null && roomId == null) {
 				errorKey = "1599";
 			} else if (recId != null) {
 				recContainer.setVisible(true);
@@ -106,25 +113,36 @@ public class HashPage extends BaseInited
 				vp.update(null, rec);
 				error = false;
 			} else {
-				replace(new SwfPanel("panel-swf", new PageParameters(p).add(WICKET_ROOM_ID, ws.getRoomId())));
-				error = false;
+				createRoom(roomId);
 			}
 		}
 		StringValue swf = p.get(SWF);
 		if (!swf.isEmpty() && (SWF_TYPE_NETWORK.equals(swf.toString()) || SWF_TYPE_SETTINGS.equals(swf.toString()))) {
-			replace(new SwfPanel("panel-swf", p));
+			replace(new SwfPanel(PANEL_MAIN, p));
 			error = false;
 		}
-		add(recContainer
-			.add(vi.setShowShare(false).setOutputMarkupPlaceholderTag(true)
-				, vp.setOutputMarkupPlaceholderTag(true)
-				, new InvitationPasswordDialog("i-pass", this)));
+		add(recContainer.add(vi.setShowShare(false).setOutputMarkupPlaceholderTag(true),
+				vp.setOutputMarkupPlaceholderTag(true), new InvitationPasswordDialog("i-pass", this)));
+	}
+
+	private void createRoom(Long roomId) {
+		error = false;
+		getHeader().setVisible(false);
+		// need to re-fetch Room object to initialize all collections
+		Room room = getBean(RoomDao.class).get(roomId);
+		if (room != null) {
+			this.roomId = roomId;
+			RoomPanel rp = new RoomPanel(CHILD_ID, room);
+			replace(new MainPanel(PANEL_MAIN, rp));
+			rp.onMenuPanelLoad(null);
+		}
 	}
 
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
-		add(new MessageDialog("access-denied", getString("invalid.hash"), getString(errorKey), DialogButtons.OK, DialogIcon.ERROR) {
+		add(new MessageDialog("access-denied", getString("invalid.hash"), getString(errorKey), DialogButtons.OK,
+				DialogIcon.ERROR) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -151,4 +169,13 @@ public class HashPage extends BaseInited
 		target.add(vi.update(target, i.getRecording()).setVisible(true)
 				, vp.update(target, i.getRecording()).setVisible(true));
 	}
+
+	@Override
+	public void renderHead(IHeaderResponse response) {
+		super.renderHead(response);
+		response.render(CssHeaderItem.forCSS(".invite.om-icon{display: none !important;}", "no-invite-to-room"));
+		if (roomId != null) {
+			response.render(OnDomReadyHeaderItem.forScript("roomLoad();"));
+		}
+	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.html Thu Aug 25 03:07:48 2016
@@ -30,31 +30,7 @@
 	</script>
 </wicket:head>
 <wicket:extend>
-	<script type="text/javascript">
-		$(function() {
-			Wicket.Event.subscribe('/ajax/call/failure', hideBusyIndicator);
-			Wicket.Event.subscribe('/ajax/call/before', showBusyIndicator);
-			Wicket.Event.subscribe('/ajax/call/success', hideBusyIndicator);
-			Wicket.Event.subscribe('/ajax/call/complete', hideBusyIndicator);
-		});
-	</script>
-	<div wicket:id="topControls">
-		<div wicket:id="topLinks"><span 
-			id="contactsAndMessages"><a wicket:id="messages"><wicket:message key="1188"/></a></span><span 
-			id="profile"><a wicket:id="profile"><wicket:message key="5"/></a></span><span 
-			id="logout"><a wicket:id="logout" href="#"><wicket:message key="310"/></a></span><span 
-			id="reportBug"><a target="_blank" href="https://issues.apache.org/jira/browse/OPENMEETINGS"><wicket:message key="284"/></a></span><span><a 
-			wicket:id="about"><wicket:message key="1549"/></a></span>
-		</div>
-		<div id="busy_indicator" class="ui-widget-header"><span><wicket:message key="1554"/></span></div>
-		<div wicket:id="menu"></div>
-	</div>
-	<div wicket:id="dev" id="devMenu"/>
-	<div wicket:id="contents"><div wicket:id="child"></div></div>
-	<div wicket:id="chatPanel"></div>
-	<div wicket:id="aboutDialog"></div>
-	<div wicket:id="userInfoDialog"></div>
-	<div wicket:id="newMessageDialog"></div>
-	<div wicket:id="inviteUserDialog"></div>
+	<div wicket:id="main"/>
+	<div wicket:id="invite-to-room"></div>
 </wicket:extend>
 </html>

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java Thu Aug 25 03:07:48 2016
@@ -18,228 +18,48 @@
  */
 package org.apache.openmeetings.web.pages;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-import static org.apache.openmeetings.web.app.Application.addOnlineUser;
-import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.removeOnlineUser;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getParam;
-import static org.apache.openmeetings.web.util.OmUrlFragment.CHILD_ID;
-import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_EDIT;
-import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES;
-import static org.apache.openmeetings.web.util.OmUrlFragment.getPanel;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+import static org.apache.openmeetings.web.common.MainPanel.PARAM_USER_ID;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.openmeetings.db.dao.basic.NavigationDao;
-import org.apache.openmeetings.db.entity.basic.Naviglobal;
-import org.apache.openmeetings.db.entity.basic.Navimain;
-import org.apache.openmeetings.db.entity.user.PrivateMessage;
-import org.apache.openmeetings.db.util.AuthLevelUtil;
-import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.WebSession;
-import org.apache.openmeetings.web.common.BasePanel;
-import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
-import org.apache.openmeetings.web.common.menu.MainMenuItem;
-import org.apache.openmeetings.web.common.menu.MenuItem;
-import org.apache.openmeetings.web.common.menu.MenuPanel;
-import org.apache.openmeetings.web.room.RoomPanel;
-import org.apache.openmeetings.web.room.menu.RoomMenuPanel;
-import org.apache.openmeetings.web.user.AboutDialog;
-import org.apache.openmeetings.web.user.ChatPanel;
+import org.apache.openmeetings.web.common.MainPanel;
 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;
-import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.devutils.debugbar.DebugBar;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.panel.EmptyPanel;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
-import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
-import org.apache.wicket.protocol.ws.api.message.AbstractClientMessage;
-import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
-import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
 import org.apache.wicket.request.IRequestParameters;
 import org.apache.wicket.util.time.Duration;
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
-import org.wicketstuff.urlfragment.UrlFragment;
-
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem;
 
 @AuthorizeInstantiation({"Admin", "Dashboard", "Room"})
 public class MainPage extends BaseInitedPage {
 	private static final long serialVersionUID = 1L;
-	private static final Logger log = Red5LoggerFactory.getLogger(MainPage.class, webAppRootKey);
-	private final static String PARAM_USER_ID = "userId";
-	private Client client;
-	private final MenuPanel menu;
-	private final WebMarkupContainer topControls = new WebMarkupContainer("topControls");
-	private final WebMarkupContainer topLinks = new WebMarkupContainer("topLinks");
-	private final MarkupContainer contents;
 	private final AbstractAjaxTimerBehavior areaBehavior;
-	private final Component dev;
-	private final ChatPanel chat;
-	private final MessageDialog newMessage;
-	private final UserInfoDialog userInfo;
+	private final MainPanel main = new MainPanel("main");
 	private final InviteUserToRoomDialog inviteUser;
-	
+
 	public MainPage() {
 		super();
-		client = new Client(getSession().getId(), getUserId());
 		getHeader().setVisible(false);
-		add(topControls.setOutputMarkupPlaceholderTag(true).setMarkupId("topControls"));
-		menu = new MenuPanel("menu", getMainMenu());
-		contents = new WebMarkupContainer("contents");
-		add(contents.add(new WebMarkupContainer(CHILD_ID)).setOutputMarkupId(true).setMarkupId("contents"));
-		topControls.add(menu.setVisible(false), topLinks.setVisible(false).setOutputMarkupPlaceholderTag(true).setMarkupId("topLinks"));
-		topLinks.add(new AjaxLink<Void>("messages") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				updateContents(PROFILE_MESSAGES, target);
-			}
-		});
-		topLinks.add(new ConfirmableAjaxBorder("logout", getString("310"), getString("634")) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-				getSession().invalidate();
-				setResponsePage(Application.get().getSignInPageClass());
-			}
-		});
-		topLinks.add(new AjaxLink<Void>("profile") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				updateContents(PROFILE_EDIT, target);
-			}
-		});
-		final AboutDialog about = new AboutDialog("aboutDialog");
-		topLinks.add(new AjaxLink<Void>("about") {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				about.open(target);
-			}
-		});
-		add(about);
-		if (getApplication().getDebugSettings().isDevelopmentUtilitiesEnabled()) {
-			add(dev = new DebugBar("dev"));
-			dev.setOutputMarkupId(true);
-		} else {
-			dev = null;
-			add(new EmptyPanel("dev").setVisible(false));
-		}		
-		
-		add(chat = new ChatPanel("chatPanel"));
-		add(newMessage = new MessageDialog("newMessageDialog", new CompoundPropertyModel<PrivateMessage>(new PrivateMessage())) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
-				BasePanel bp = getCurrentPanel();
-				if (send.equals(button) && bp != null) {
-					bp.onNewMessageClose(handler);
-				}
-			}
-		});
-		add(userInfo = new UserInfoDialog("userInfoDialog", newMessage));
-		add(inviteUser = new InviteUserToRoomDialog("inviteUserDialog"));
-		add(new AbstractDefaultAjaxBehavior() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void respond(AjaxRequestTarget target) {
-				userInfo.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("showUserInfo", this, explicit(PARAM_USER_ID)), "showUserInfo")));
-			}
-		});
-		add(new AbstractDefaultAjaxBehavior() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void respond(AjaxRequestTarget target) {
-				ContactsHelper.addUserToContactList(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("addContact", this, explicit(PARAM_USER_ID)), "addContact")));
-			}
-		});
-		add(new AbstractDefaultAjaxBehavior() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void respond(AjaxRequestTarget target) {
-				newMessage.reset(true).open(target, getParam(getComponent(), PARAM_USER_ID).toOptionalLong());
-			}
-			
-			@Override
-			public void renderHead(Component component, IHeaderResponse response) {
-				super.renderHead(component, response);
-				response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("privateMessage", this, explicit(PARAM_USER_ID)), "privateMessage")));
-			}
-		});
-		add(new WebSocketBehavior() {
+		add(main, inviteUser = new InviteUserToRoomDialog("invite-to-room"));
+		//load preselected content
+		add(areaBehavior = new AbstractAjaxTimerBehavior(Duration.ONE_SECOND) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void onConnect(ConnectedMessage message) {
-				super.onConnect(message);
-				addOnlineUser(client.setPageId(message.getKey()));
-				log.debug("WebSocketBehavior::onConnect [uid: {}, session: {}, key: {}]", client.getUid(), message.getSessionId(), message.getKey());
-			}
-			
-			@Override
-			protected void onAbort(AbortedMessage message) {
-				super.onAbort(message);
-				closeHandler(message);
-			}
-			
-			@Override
-			protected void onClose(ClosedMessage message) {
-				super.onClose(message);
-				closeHandler(message);
-			}
-			
-			private void closeHandler(AbstractClientMessage message) {
-				if (MainPage.this.getCurrentPanel() instanceof RoomPanel) {
-					RoomPanel rp = (RoomPanel)MainPage.this.getCurrentPanel();
-					RoomMenuPanel.roomExit(rp);
-				}
-				removeOnlineUser(client);
-				log.debug("WebSocketBehavior::closeHandler [uid: {}, session: {}, key: {}]", client.getUid(), message.getSessionId(), message.getKey());
+			protected void onTimer(AjaxRequestTarget target) {
+				OmUrlFragment area = WebSession.get().getArea();
+				main.updateContents(area == null ? OmUrlFragment.get() : area, target);
+				stop(target);
+				WebSession.get().setArea(null);
 			}
 		});
 		add(new AbstractDefaultAjaxBehavior() {
@@ -256,104 +76,23 @@ public class MainPage extends BaseInited
 				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;
-
-			@Override
-			protected void onTimer(AjaxRequestTarget target) {
-				OmUrlFragment area = WebSession.get().getArea();
-				updateContents(area == null ? OmUrlFragment.get() : area, target);
-				stop(target);
-				WebSession.get().setArea(null);
-			}
-		});
 	}
-	
-	private List<IMenuItem> getMainMenu() {
-		List<IMenuItem> menu = new ArrayList<>();
-		for (Naviglobal gl : getBean(NavigationDao.class).getMainMenu(AuthLevelUtil.hasAdminLevel(WebSession.getRights()))) {
-			List<IMenuItem> l = new ArrayList<>();
-			for (Navimain nm : gl.getMainnavi()) {
-				l.add(new MainMenuItem(nm) {
-					private static final long serialVersionUID = 1L;
 
-					@Override
-					public void onClick(AjaxRequestTarget target) {
-						onClick(MainPage.this, target);
-					}
-				}); 
-			}
-			menu.add(new MenuItem(Application.getString(gl.getLabelId()), l));
-		}
-		return menu;
-	}
-	
 	public void updateContents(OmUrlFragment f, IPartialPageRequestHandler handler) {
-		updateContents(f, handler, true);
-	}
-	
-	private BasePanel getCurrentPanel() {
-		Component prev = contents.get(CHILD_ID);
-		if (prev != null && prev instanceof BasePanel) {
-			return (BasePanel)prev;
-		}
-		return null;
+		main.updateContents(f, handler);
 	}
-	
-	public void updateContents(OmUrlFragment f, IPartialPageRequestHandler handler, boolean updateFragment) {
-		BasePanel panel = getPanel(f.getArea(), f.getType());
-		if (panel != null) {
-			BasePanel prev = getCurrentPanel();
-			if (prev != null) {
-				prev.cleanup(handler);
-			}
-			handler.add(contents.replace(panel));
-			if (updateFragment) {
-				UrlFragment uf = new UrlFragment(handler);
-				uf.set(f.getArea().name(), f.getType());
-			}
-			panel.onMenuPanelLoad(handler);
-		}
-		/* FIXME commented until wicket 7.2.0 will be released
-		   TODO check if this call is necessary
-		if (dev != null){
-			target.add(dev);
-		}
-		*/
+
+	@Override
+	protected boolean isMainPage() {
+		return true;
 	}
-	
+
 	@Override
 	protected void onParameterArrival(IRequestParameters params, AjaxRequestTarget target) {
 		OmUrlFragment uf = getUrlFragment(params);
 		if (uf != null) {
 			areaBehavior.stop(target);
-			updateContents(uf, target, false);
+			main.updateContents(uf, target, false);
 		}
 	}
-	
-	public MenuPanel getMenu() {
-		return menu;
-	}
-
-	public WebMarkupContainer getTopLinks() {
-		return topLinks;
-	}
-
-	public WebMarkupContainer getTopControls() {
-		return topControls;
-	}
-
-	public ChatPanel getChat() {
-		return chat;
-	}
-	
-	@Override
-	protected boolean isMainPage() {
-		return true;
-	}
-	
-	public Client getClient() {
-		return client;
-	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Thu Aug 25 03:07:48 2016
@@ -114,7 +114,7 @@ public class RoomPanel extends BasePanel
 				String path = url.getPath();
 				path = path.substring(1, path.indexOf('/', 2) + 1);
 				broadcast(new RoomMessage(r.getId(), getUserId(), RoomMessage.Type.roomEnter));
-				getMainPage().getChat().roomEnter(r, target);
+				getMainPanel().getChat().roomEnter(r, target);
 			} catch (MalformedURLException e) {
 				log.error("Error while constructing room parameters", e);
 			}
@@ -406,25 +406,30 @@ public class RoomPanel extends BasePanel
 			}
 		}
 	}
-	
+
 	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
-		handler.add(getMainPage().getHeader().setVisible(false), getMainPage().getTopControls().setVisible(false));
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
+		getBasePage().getHeader().setVisible(false);
+		getMainPanel().getTopControls().setVisible(false);
 		if (r.isHidden(RoomElement.Chat)) {
-			getMainPage().getChat().toggle(handler, false);
+			getMainPanel().getChat().toggle(handler, false);
+		}
+		if (handler != null) {
+			handler.add(getBasePage().getHeader(), getMainPanel().getTopControls());
+			handler.appendJavaScript("roomLoad();");
 		}
-		handler.appendJavaScript("roomLoad();");
+		return this;
 	}
-	
+
 	@Override
 	public void cleanup(IPartialPageRequestHandler handler) {
-		handler.add(getMainPage().getHeader().setVisible(true), getMainPage().getTopControls().setVisible(true));
+		handler.add(getBasePage().getHeader().setVisible(true), getMainPanel().getTopControls().setVisible(true));
 		if (r.isHidden(RoomElement.Chat)) {
-			getMainPage().getChat().toggle(handler, true);
+			getMainPanel().getChat().toggle(handler, true);
 		}
 		handler.appendJavaScript("$(window).off('resize.openmeetings');");
 		RoomMenuPanel.roomExit(this);
-		getMainPage().getChat().roomExit(r, handler);
+		getMainPanel().getChat().roomExit(r, handler);
 	}
 
 	private static ResourceReference newResourceReference() {
@@ -500,7 +505,7 @@ public class RoomPanel extends BasePanel
 	}
 	
 	public Client getClient() {
-		return getMainPage().getClient();
+		return getMainPanel().getClient();
 	}
 
 	public boolean screenShareAllowed() {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java Thu Aug 25 03:07:48 2016
@@ -321,7 +321,7 @@ public class RoomMenuPanel extends Panel
 	public void exit(IPartialPageRequestHandler handler) {
 		if (WebSession.getRights().contains(User.Right.Dashboard)) {
 			roomExit(room, false);
-			room.getMainPage().updateContents(ROOMS_PUBLIC, handler);
+			room.getMainPanel().updateContents(ROOMS_PUBLIC, handler);
 		} else {
 			String url = getBean(ConfigurationDao.class).getConfValue(CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY, String.class, "");
 			if (Strings.isEmpty(url)) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Thu Aug 25 03:07:48 2016
@@ -205,19 +205,22 @@ public class ChatPanel extends BasePanel
 		sb.append("});");
 		target.appendJavaScript(sb);
 	}
-	
+
 	public void roomExit(Room r, IPartialPageRequestHandler handler) {
 		if (r.isHidden(RoomElement.Chat)) {
 			return;
 		}
 		handler.appendJavaScript(String.format("removeChatTab('%1$s%2$d');", ID_ROOM_PREFIX, r.getId()));
 	}
-	
+
 	public void toggle(IPartialPageRequestHandler handler, boolean visible) {
-		handler.add(setVisible(visible));
-		handler.appendJavaScript("reinit();");
+		setVisible(visible);
+		if (handler != null) {
+			handler.add(this);
+			handler.appendJavaScript("reinit();");
+		}
 	}
-	
+
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java Thu Aug 25 03:07:48 2016
@@ -70,25 +70,20 @@ public class CalendarPanel extends UserP
 		}
 	};
 	private Calendar calendar;
-	
-	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
-		super.onMenuPanelLoad(handler);
-	}
 
 	@Override
 	public void cleanup(IPartialPageRequestHandler handler) {
 		refreshTimer.stop(handler);
 	}
-	
+
 	private static AppointmentDao getDao() {
 		return getBean(AppointmentDao.class);
 	}
-	
+
 	public void refresh(IPartialPageRequestHandler handler) {
 		calendar.refresh(handler);
 	}
-	
+
 	Calendar getCalendar() {
 		return calendar;
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css Thu Aug 25 03:07:48 2016
@@ -66,6 +66,7 @@
 	height: 30px;
 	background-repeat: no-repeat;
 	background-position: 5px 5px;
+	background-size: 22px;
 	float: right;
 	padding: 0;
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/configurations/ConfigsPanel.java Thu Aug 25 03:07:48 2016
@@ -22,6 +22,7 @@ import org.apache.openmeetings.db.dao.ba
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
+import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
@@ -46,9 +47,10 @@ public class ConfigsPanel extends AdminP
 	private final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
 	
 	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
 		super.onMenuPanelLoad(handler);
 		handler.appendJavaScript("omConfigPanelInit();");
+		return this;
 	}
 
 	public ConfigsPanel(String id) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java Thu Aug 25 03:07:48 2016
@@ -42,7 +42,6 @@ import org.apache.openmeetings.web.data.
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-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.form.Form;
@@ -209,9 +208,4 @@ public class ConnectionsPanel extends Ad
 			}
 		});
 	}
-
-	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
-		super.onMenuPanelLoad(handler);
-	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupsPanel.java Thu Aug 25 03:07:48 2016
@@ -23,6 +23,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
+import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
@@ -45,11 +46,12 @@ import org.apache.wicket.markup.repeater
 public class GroupsPanel extends AdminPanel {
 	private static final long serialVersionUID = 1L;
 	private GroupForm form;
-	
+
 	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
 		super.onMenuPanelLoad(handler);
 		handler.appendJavaScript("groupsInit();");
+		return this;
 	}
 
 	public GroupsPanel(String id) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.java Thu Aug 25 03:07:48 2016
@@ -33,6 +33,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
@@ -79,9 +80,10 @@ public class LangPanel extends AdminPane
 	Map.Entry<Long, Locale> language;
 	
 	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
 		super.onMenuPanelLoad(handler);
 		handler.appendJavaScript("labelsInit();");
+		return this;
 	}
 
 	public LangPanel(String id) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/ldaps/LdapsPanel.java Thu Aug 25 03:07:48 2016
@@ -22,6 +22,7 @@ import org.apache.openmeetings.db.dao.se
 import org.apache.openmeetings.db.entity.server.LdapConfig;
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
+import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
@@ -46,9 +47,10 @@ public class LdapsPanel extends AdminPan
 	private LdapForm form;
 	
 	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
 		super.onMenuPanelLoad(handler);
 		handler.appendJavaScript("omLdapPanelInit();");
+		return this;
 	}
 
 	public LdapsPanel(String id) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomsPanel.java Thu Aug 25 03:07:48 2016
@@ -24,6 +24,7 @@ import org.apache.openmeetings.db.dao.ro
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
+import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
@@ -46,9 +47,10 @@ public class RoomsPanel extends AdminPan
 	private RoomForm form;
 	
 	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
 		super.onMenuPanelLoad(handler);
 		handler.appendJavaScript("omRoomPanelInit();");
+		return this;
 	}
 
 	public RoomsPanel(String id) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/servers/ServersPanel.java Thu Aug 25 03:07:48 2016
@@ -22,6 +22,7 @@ import org.apache.openmeetings.db.dao.se
 import org.apache.openmeetings.db.entity.server.Server;
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
+import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
@@ -46,9 +47,10 @@ public class ServersPanel extends AdminP
 	private ServerForm form;
 	
 	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
 		super.onMenuPanelLoad(handler);
 		handler.appendJavaScript("omServerPanelInit();");
+		return this;
 	}
 
 	public ServersPanel(String id) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UsersPanel.java Thu Aug 25 03:07:48 2016
@@ -26,6 +26,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.BasePanel;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.DataViewContainer;
 import org.apache.openmeetings.web.data.OmOrderByBorder;
@@ -55,9 +56,10 @@ public class UsersPanel extends AdminPan
 	};
 
 	@Override
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
 		super.onMenuPanelLoad(handler);
 		handler.appendJavaScript("omUserPanelInit();");
+		return this;
 	}
 
 	private UserForm form;

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Thu Aug 25 03:07:48 2016
@@ -117,7 +117,7 @@ public class WebSession extends Abstract
 		removeOnlineUser(getClientByKeys(getUserId(), get().getId()));
 		super.invalidate();
 		userId = null;
-		rights = new HashSet<User.Right>();
+		rights = Collections.unmodifiableSet(Collections.<Right>emptySet());
 		SID = null;
 		ISO8601FORMAT = null;
 		sdf = null;
@@ -184,15 +184,18 @@ public class WebSession extends Abstract
 				}
 				i = getBean(InvitationDao.class).getByHash(invitation.toString(), false, false);
 				if (i.isAllowEntry()) {
-					setUser(i.getInvitee(), true);
+					Set<Right> rights = new HashSet<>();
 					//TODO markUsed
 					if (i.getRoom() != null) {
+						rights.add(Right.Room);
 						roomId = i.getRoom().getId();
 					} else if (i.getAppointment() != null && i.getAppointment().getRoom() != null) {
+						rights.add(Right.Room);
 						roomId = i.getAppointment().getRoom().getId();
 					} else if (i.getRecording() != null) {
 						recordingId = i.getRecording().getId();
 					}
+					setUser(i.getInvitee(), rights);
 				}
 			}
 		} catch (Exception e) {
@@ -240,7 +243,7 @@ public class WebSession extends Abstract
 						soapDao.update(soapLogin);
 					}
 					sessionDao.updateUser(SID, user.getId());
-					setUser(user, true);
+					setUser(user, null);
 					roomId = soapLogin.getRoomId();
 					recordingId = soapLogin.getRecordingId();
 					return true;
@@ -250,7 +253,7 @@ public class WebSession extends Abstract
 		return false;
 	}
 
-	private void setUser(User u, boolean emptyRights) {
+	private void setUser(User u, Set<Right> rights) {
 		String _sid = SID;
 		Long _recordingId = recordingId;
 		Long _roomId = roomId;
@@ -269,10 +272,10 @@ public class WebSession extends Abstract
 			i = _i;
 		}
 		userId = u.getId();
-		if (emptyRights) {
-			rights = Collections.unmodifiableSet(Collections.<Right>emptySet());
+		if (rights == null || rights.isEmpty()) {
+			this.rights = Collections.unmodifiableSet(u.getRights());
 		} else {
-			rights = Collections.unmodifiableSet(u.getRights());
+			this.rights = Collections.unmodifiableSet(rights);
 		}
 		languageId = u.getLanguageId();
 		externalType = u.getExternalType();
@@ -318,7 +321,7 @@ public class WebSession extends Abstract
 		if (u == null) {
 			return false;
 		}
-		setUser(u, false);
+		setUser(u, null);
 		return true;
 	}
 	

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/BasePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/BasePanel.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/BasePanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/BasePanel.java Thu Aug 25 03:07:48 2016
@@ -21,7 +21,7 @@ package org.apache.openmeetings.web.comm
 import org.apache.openmeetings.db.util.FormatHelper;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.menu.MenuPanel;
-import org.apache.openmeetings.web.pages.MainPage;
+import org.apache.openmeetings.web.pages.BasePage;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
@@ -39,23 +39,28 @@ public abstract class BasePanel extends
 		setOutputMarkupId(true);
 	}
 
-	public MainPage getMainPage() {
-		return (MainPage)super.getPage();
+	public BasePage getBasePage() {
+		return (BasePage)getPage();
 	}
-	
+
+	public MainPanel getMainPanel() {
+		return findParent(MainPanel.class);
+	}
+
 	protected boolean isRtl() { //TODO unify, remove copy/paste
 		return FormatHelper.isRtlLanguage(WebSession.get().getLocale().toLanguageTag());
 	}
-	
+
 	/**
 	 * Overwrite this method to execute Java code after Panel is loaded by the
 	 * {@link MenuPanel}
 	 * 
 	 * @param target
 	 */
-	public void onMenuPanelLoad(IPartialPageRequestHandler handler) {
-		handler.add(getMainPage().getHeader().setVisible(true), getMainPage().getMenu().setVisible(true)
-				, getMainPage().getTopLinks().setVisible(true));
+	public BasePanel onMenuPanelLoad(IPartialPageRequestHandler handler) {
+		handler.add(getBasePage().getHeader().setVisible(true), getMainPanel().getMenu().setVisible(true)
+				, getMainPanel().getTopLinks().setVisible(true));
+		return this;
 	}
 
 	/**

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.html?rev=1757594&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.html (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.html Thu Aug 25 03:07:48 2016
@@ -0,0 +1,59 @@
+<?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:head>
+	<script type="text/javascript">
+		function showBusyIndicator() {
+			$('#busy_indicator').show();
+		}
+		function hideBusyIndicator() {
+			$('#busy_indicator').hide();
+		}
+	</script>
+</wicket:head>
+<wicket:panel>
+	<script type="text/javascript">
+		$(function() {
+			Wicket.Event.subscribe('/ajax/call/failure', hideBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/before', showBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/success', hideBusyIndicator);
+			Wicket.Event.subscribe('/ajax/call/complete', hideBusyIndicator);
+		});
+	</script>
+	<div wicket:id="topControls">
+		<div wicket:id="topLinks"><span 
+			id="contactsAndMessages"><a wicket:id="messages"><wicket:message key="1188"/></a></span><span 
+			id="profile"><a wicket:id="profile"><wicket:message key="5"/></a></span><span 
+			id="logout"><a wicket:id="logout" href="#"><wicket:message key="310"/></a></span><span 
+			id="reportBug"><a target="_blank" href="https://issues.apache.org/jira/browse/OPENMEETINGS"><wicket:message key="284"/></a></span><span><a 
+			wicket:id="about"><wicket:message key="1549"/></a></span>
+		</div>
+		<div id="busy_indicator" class="ui-widget-header"><span><wicket:message key="1554"/></span></div>
+		<div wicket:id="menu"></div>
+	</div>
+	<div wicket:id="dev" id="devMenu"/>
+	<div wicket:id="contents"><div wicket:id="child"></div></div>
+	<div wicket:id="chatPanel"></div>
+	<div wicket:id="aboutDialog"></div>
+	<div wicket:id="userInfoDialog"></div>
+	<div wicket:id="newMessageDialog"></div>
+</wicket:panel>
+</html>

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java?rev=1757594&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java Thu Aug 25 03:07:48 2016
@@ -0,0 +1,301 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.common;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.web.app.Application.addOnlineUser;
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.removeOnlineUser;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
+import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getParam;
+import static org.apache.openmeetings.web.util.OmUrlFragment.CHILD_ID;
+import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_EDIT;
+import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES;
+import static org.apache.openmeetings.web.util.OmUrlFragment.getPanel;
+import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.basic.NavigationDao;
+import org.apache.openmeetings.db.entity.basic.Naviglobal;
+import org.apache.openmeetings.db.entity.basic.Navimain;
+import org.apache.openmeetings.db.entity.user.PrivateMessage;
+import org.apache.openmeetings.db.util.AuthLevelUtil;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.openmeetings.web.common.menu.MainMenuItem;
+import org.apache.openmeetings.web.common.menu.MenuItem;
+import org.apache.openmeetings.web.common.menu.MenuPanel;
+import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.openmeetings.web.room.menu.RoomMenuPanel;
+import org.apache.openmeetings.web.user.AboutDialog;
+import org.apache.openmeetings.web.user.ChatPanel;
+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;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
+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.devutils.debugbar.DebugBar;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.PriorityHeaderItem;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.EmptyPanel;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
+import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
+import org.apache.wicket.protocol.ws.api.message.AbstractClientMessage;
+import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
+import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.wicketstuff.urlfragment.UrlFragment;
+
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem;
+
+public class MainPanel extends Panel {
+	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(MainPanel.class, webAppRootKey);
+	public final static String PARAM_USER_ID = "userId";
+	private Client client;
+	private final MenuPanel menu;
+	private final WebMarkupContainer topControls = new WebMarkupContainer("topControls");
+	private final WebMarkupContainer topLinks = new WebMarkupContainer("topLinks");
+	private final MarkupContainer contents;
+	private final ChatPanel chat;
+	private final MessageDialog newMessage;
+	private final UserInfoDialog userInfo;
+
+	public MainPanel(String id) {
+		this(id, new WebMarkupContainer(CHILD_ID));
+	}
+
+	public MainPanel(String id, WebMarkupContainer panel) {
+		super(id);
+		client = new Client(getSession().getId(), getUserId());
+		add(topControls.setOutputMarkupPlaceholderTag(true).setMarkupId("topControls"));
+		menu = new MenuPanel("menu", getMainMenu());
+		contents = new WebMarkupContainer("contents");
+		add(contents.add(panel).setOutputMarkupId(true).setMarkupId("contents"));
+		topControls.add(menu.setVisible(false), topLinks.setVisible(false).setOutputMarkupPlaceholderTag(true).setMarkupId("topLinks"));
+		topLinks.add(new AjaxLink<Void>("messages") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				updateContents(PROFILE_MESSAGES, target);
+			}
+		});
+		topLinks.add(new ConfirmableAjaxBorder("logout", getString("310"), getString("634")) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+				getSession().invalidate();
+				setResponsePage(Application.get().getSignInPageClass());
+			}
+		});
+		topLinks.add(new AjaxLink<Void>("profile") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				updateContents(PROFILE_EDIT, target);
+			}
+		});
+		final AboutDialog about = new AboutDialog("aboutDialog");
+		topLinks.add(new AjaxLink<Void>("about") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				about.open(target);
+			}
+		});
+		if (getApplication().getDebugSettings().isDevelopmentUtilitiesEnabled()) {
+			add(new DebugBar("dev").setOutputMarkupId(true));
+		} else {
+			add(new EmptyPanel("dev").setVisible(false));
+		}
+		add(about, chat = new ChatPanel("chatPanel"));
+		add(newMessage = new MessageDialog("newMessageDialog", new CompoundPropertyModel<PrivateMessage>(new PrivateMessage())) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
+				BasePanel bp = getCurrentPanel();
+				if (send.equals(button) && bp != null) {
+					bp.onNewMessageClose(handler);
+				}
+			}
+		});
+		add(userInfo = new UserInfoDialog("userInfoDialog", newMessage));
+		add(new AbstractDefaultAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void respond(AjaxRequestTarget target) {
+				userInfo.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("showUserInfo", this, explicit(PARAM_USER_ID)), "showUserInfo")));
+			}
+		});
+		add(new AbstractDefaultAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void respond(AjaxRequestTarget target) {
+				ContactsHelper.addUserToContactList(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("addContact", this, explicit(PARAM_USER_ID)), "addContact")));
+			}
+		});
+		add(new AbstractDefaultAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void respond(AjaxRequestTarget target) {
+				newMessage.reset(true).open(target, getParam(getComponent(), PARAM_USER_ID).toOptionalLong());
+			}
+			
+			@Override
+			public void renderHead(Component component, IHeaderResponse response) {
+				super.renderHead(component, response);
+				response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("privateMessage", this, explicit(PARAM_USER_ID)), "privateMessage")));
+			}
+		});
+		add(new WebSocketBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onConnect(ConnectedMessage message) {
+				super.onConnect(message);
+				addOnlineUser(client.setPageId(message.getKey()));
+				log.debug("WebSocketBehavior::onConnect [uid: {}, session: {}, key: {}]", client.getUid(), message.getSessionId(), message.getKey());
+			}
+			
+			@Override
+			protected void onAbort(AbortedMessage message) {
+				super.onAbort(message);
+				closeHandler(message);
+			}
+			
+			@Override
+			protected void onClose(ClosedMessage message) {
+				super.onClose(message);
+				closeHandler(message);
+			}
+			
+			private void closeHandler(AbstractClientMessage message) {
+				if (MainPanel.this.getCurrentPanel() instanceof RoomPanel) {
+					RoomPanel rp = (RoomPanel)MainPanel.this.getCurrentPanel();
+					RoomMenuPanel.roomExit(rp);
+				}
+				removeOnlineUser(client);
+				log.debug("WebSocketBehavior::closeHandler [uid: {}, session: {}, key: {}]", client.getUid(), message.getSessionId(), message.getKey());
+			}
+		});
+	}
+
+	private List<IMenuItem> getMainMenu() {
+		List<IMenuItem> menu = new ArrayList<>();
+		for (Naviglobal gl : getBean(NavigationDao.class).getMainMenu(AuthLevelUtil.hasAdminLevel(WebSession.getRights()))) {
+			List<IMenuItem> l = new ArrayList<>();
+			for (Navimain nm : gl.getMainnavi()) {
+				l.add(new MainMenuItem(nm) {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					public void onClick(AjaxRequestTarget target) {
+						onClick(MainPanel.this, target);
+					}
+				}); 
+			}
+			menu.add(new MenuItem(Application.getString(gl.getLabelId()), l));
+		}
+		return menu;
+	}
+
+	public void updateContents(OmUrlFragment f, IPartialPageRequestHandler handler) {
+		updateContents(f, handler, true);
+	}
+
+	private BasePanel getCurrentPanel() {
+		Component prev = contents.get(CHILD_ID);
+		if (prev != null && prev instanceof BasePanel) {
+			return (BasePanel)prev;
+		}
+		return null;
+	}
+
+	public void updateContents(OmUrlFragment f, IPartialPageRequestHandler handler, boolean updateFragment) {
+		BasePanel panel = getPanel(f.getArea(), f.getType());
+		if (panel != null) {
+			BasePanel prev = getCurrentPanel();
+			if (prev != null) {
+				prev.cleanup(handler);
+			}
+			handler.add(contents.replace(panel));
+			if (updateFragment) {
+				UrlFragment uf = new UrlFragment(handler);
+				uf.set(f.getArea().name(), f.getType());
+			}
+			panel.onMenuPanelLoad(handler);
+		}
+	}
+
+	public MenuPanel getMenu() {
+		return menu;
+	}
+
+	public WebMarkupContainer getTopLinks() {
+		return topLinks;
+	}
+
+	public WebMarkupContainer getTopControls() {
+		return topControls;
+	}
+
+	public ChatPanel getChat() {
+		return chat;
+	}
+
+	public Client getClient() {
+		return client;
+	}
+}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MainMenuItem.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MainMenuItem.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MainMenuItem.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MainMenuItem.java Thu Aug 25 03:07:48 2016
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.comm
 
 import org.apache.openmeetings.db.entity.basic.Navimain;
 import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.pages.MainPage;
+import org.apache.openmeetings.web.common.MainPanel;
 import org.apache.openmeetings.web.util.OmUrlFragment;
 import org.apache.openmeetings.web.util.OmUrlFragment.MenuActions;
 import org.apache.openmeetings.web.util.OmUrlFragment.MenuParams;
@@ -37,7 +37,7 @@ public class MainMenuItem extends MenuIt
 		params = m.getParams() != null ? MenuParams.valueOf(m.getParams()) : MenuParams.publicTabButton;
 	}
 	
-	public void onClick(MainPage page, AjaxRequestTarget target) {
-		page.updateContents(new OmUrlFragment(action, params), target);
+	public void onClick(MainPanel main, AjaxRequestTarget target) {
+		main.updateContents(new OmUrlFragment(action, params), target);
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/AccessDeniedPage.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/AccessDeniedPage.java?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/AccessDeniedPage.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/AccessDeniedPage.java Thu Aug 25 03:07:48 2016
@@ -46,7 +46,7 @@ public class AccessDeniedPage extends Ba
 
 					@Override
 					public boolean isVisible() {
-						return !WebSession.get().isSignedIn();
+						return WebSession.get().isSignedIn();
 					}
 
 					@Override

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.html?rev=1757594&r1=1757593&r2=1757594&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.html Thu Aug 25 03:07:48 2016
@@ -27,7 +27,7 @@
 		</div>
 		<div wicket:id="i-pass"></div>
 	</div>
-	<div wicket:id="panel-swf" style="width: 100%; height: 100%;"></div>
+	<div wicket:id="panel-main" style="width: 100%; height: 100%;"></div>
 	<div wicket:id="access-denied"></div>
 </wicket:extend>
 </html>