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/04/30 17:29:30 UTC

[18/50] [abbrv] openmeetings git commit: [OPENMEETINGS-551] basic work on video settings

[OPENMEETINGS-551] basic work on video settings


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/35544aaf
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/35544aaf
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/35544aaf

Branch: refs/heads/master
Commit: 35544aafcd363362ad2530e15f1bc6d464157ade
Parents: d8febfd
Author: Maxim Solodovnik <so...@apache.org>
Authored: Sat Apr 8 10:09:46 2017 +0000
Committer: Maxim Solodovnik <so...@apache.org>
Committed: Sat Apr 8 10:09:46 2017 +0000

----------------------------------------------------------------------
 openmeetings-flash/pom.xml                      |   2 +-
 openmeetings-flash/src/main/flex/main.mxml      |   8 +-
 .../openmeetings/web/common/NameDialog.java     |   2 +-
 .../web/common/tree/FileTreePanel.java          |   4 +-
 .../web/pages/InvitationPasswordDialog.java     |   6 +-
 .../web/pages/auth/ForgetPasswordDialog.java    |  13 +-
 .../web/pages/auth/KickMessageDialog.java       |   5 +-
 .../web/pages/auth/RegisterDialog.java          |  25 +--
 .../web/pages/auth/ResetPasswordDialog.java     |  19 +-
 .../web/pages/auth/SignInDialog.java            |   6 +-
 .../web/pages/install/InstallWizard.java        |   2 +-
 .../openmeetings/web/room/NicknameDialog.java   |   6 +-
 .../web/room/RedirectMessageDialog.java         |  25 ++-
 .../org/apache/openmeetings/web/room/room.js    |  53 +++++-
 .../web/room/sidebar/RoomSidebar.html           |  67 +++++++
 .../web/room/sidebar/icon/SettingsIcon.java     |   4 +-
 .../openmeetings/web/room/wb/WbPanel.java       | 176 +++++++++++--------
 .../org/apache/openmeetings/web/room/wb/wb.js   |  31 ++--
 .../web/user/calendar/AppointmentDialog.java    |   2 +-
 .../web/util/NonClosableDialog.java             |  39 ++++
 .../web/util/NonClosableMessageDialog.java      |  46 +++++
 openmeetings-web/src/main/webapp/css/room.css   |  37 ++++
 22 files changed, 402 insertions(+), 176 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-flash/pom.xml
----------------------------------------------------------------------
diff --git a/openmeetings-flash/pom.xml b/openmeetings-flash/pom.xml
index ca687f7..be7f36c 100644
--- a/openmeetings-flash/pom.xml
+++ b/openmeetings-flash/pom.xml
@@ -16,7 +16,7 @@
    limitations under the License.
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+		xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>org.apache.openmeetings</groupId>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-flash/src/main/flex/main.mxml
----------------------------------------------------------------------
diff --git a/openmeetings-flash/src/main/flex/main.mxml b/openmeetings-flash/src/main/flex/main.mxml
index e173816..9287291 100644
--- a/openmeetings-flash/src/main/flex/main.mxml
+++ b/openmeetings-flash/src/main/flex/main.mxml
@@ -19,9 +19,9 @@
 
 -->
 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
-			   xmlns:s="library://ns.adobe.com/flex/spark"
-			   xmlns:mx="library://ns.adobe.com/flex/mx" width="570" height="900" pageTitle="Openmeetings"
-			   preinitialize="init()" fontSize="12" applicationComplete="appInit()">
+		xmlns:s="library://ns.adobe.com/flex/spark"
+		xmlns:mx="library://ns.adobe.com/flex/mx" width="570" height="900" pageTitle="Openmeetings"
+		preinitialize="init()" fontSize="12" applicationComplete="appInit()">
 	<fx:Declarations>
 		<!-- Place non-visual elements (e.g., services, value objects) here -->
 		<mx:TraceTarget/>
@@ -477,7 +477,7 @@
 					</s:Group>
 				</s:Scroller>
 				<s:Label id="timerText" height="20" width="45" x="{videoGroup.width - 60}" y="5" paddingLeft="5" paddingTop="5"
-				         visible="false" backgroundColor="0xf5f5f5" fontWeight="bold"><s:text></s:text></s:Label>
+						visible="false" backgroundColor="0xf5f5f5" fontWeight="bold"><s:text></s:text></s:Label>
 				<s:VGroup id="playGroup">
 					<s:Group>
 						<s:Graphic x="0" z="1">

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
index ab4c811..5a7992d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
@@ -40,7 +40,7 @@ public abstract class NameDialog extends AbstractFormDialog<String> {
 	private final DialogButton add;
 	private final DialogButton cancel = new DialogButton("cancel", Application.getString(219));
 	private final Form<String> form;
-	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
+	protected final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
 	private final String name;
 	private RequiredTextField<String> title;
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index dff9122..37552d2 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@ -38,9 +38,9 @@ import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.util.AjaxDownload;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
@@ -149,7 +149,7 @@ public abstract class FileTreePanel extends Panel {
 								String statement = "var $drop = $(this);";
 								statement += "$('body').append('<div id=" + dialogId + ">" + getString("713") + "</div>');";
 								statement += "$( '#" + dialogId
-										+ "' ).dialog({ title: '" + escapeEcmaScript(getString("80")) + "', dialogClass: 'no-close', buttons: [";
+										+ "' ).dialog({ title: '" + escapeEcmaScript(getString("80")) + "', classes: {'ui-dialog-titlebar': 'ui-corner-all no-close'}, buttons: [";
 								statement += "	{ text: '" + escapeEcmaScript(getString("54")) + "', click: function() { $drop.append(ui.draggable); $(this).dialog('close'); " + super.getCallbackFunctionBody(parameters) + " } },";
 								statement += "	{ text: '" + escapeEcmaScript(getString("25")) + "', click: function() { $(this).dialog('close'); } } ";
 								statement += "],";

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java
index ef994a0..2dddfbb 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InvitationPasswordDialog.java
@@ -26,6 +26,7 @@ import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.IUpdatable;
+import org.apache.openmeetings.web.util.NonClosableDialog;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
@@ -38,11 +39,10 @@ import org.apache.wicket.validation.ValidationError;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
-public class InvitationPasswordDialog extends AbstractFormDialog<Invitation> {
+public class InvitationPasswordDialog extends NonClosableDialog<Invitation> {
 	private static final long serialVersionUID = 1L;
 	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
 	private final DialogButton check = new DialogButton("check", Application.getString(537));
@@ -87,8 +87,6 @@ public class InvitationPasswordDialog extends AbstractFormDialog<Invitation> {
 		super.onConfigure(behavior);
 		Invitation i = WebSession.get().getInvitation();
 		behavior.setOption("autoOpen", i != null && i.isPasswordProtected());
-		behavior.setOption("closeOnEscape", false);
-		behavior.setOption("dialogClass", Options.asString("no-close"));
 		behavior.setOption("resizable", false);
 	}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
index e89f9f7..0767e03 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ForgetPasswordDialog.java
@@ -32,6 +32,7 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.service.mail.template.ResetPasswordTemplate;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.pages.ResetPage;
+import org.apache.openmeetings.web.util.NonClosableMessageDialog;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
@@ -48,12 +49,9 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
-import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
 import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
 import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
@@ -136,17 +134,10 @@ public class ForgetPasswordDialog extends AbstractFormDialog<String> {
 				super.onDetach();
 			}
 		});
-		confirmDialog = new MessageDialog("confirmDialog", Application.getString(312), Application.getString(321), DialogButtons.OK, DialogIcon.INFO){
+		confirmDialog = new NonClosableMessageDialog("confirmDialog", Application.getString(312), Application.getString(321)){
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void onConfigure(JQueryBehavior behavior) {
-				super.onConfigure(behavior);
-				behavior.setOption("dialogClass", Options.asString("no-close"));
-				behavior.setOption("closeOnEscape", false);
-			}
-
-			@Override
 			public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
 				s.open(handler);
 			}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/KickMessageDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/KickMessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/KickMessageDialog.java
index 0bea145..b2f489f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/KickMessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/KickMessageDialog.java
@@ -24,7 +24,6 @@ import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.basic.Label;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 
@@ -40,13 +39,13 @@ public class KickMessageDialog extends AbstractDialog<String> {
 		super.onInitialize();
 		add(new Label("message", getString("606")));
 	};
-	
+
 	@Override
 	public void onConfigure(JQueryBehavior behavior) {
 		super.onConfigure(behavior);
 		behavior.setOption("autoOpen", true);
 		behavior.setOption("closeOnEscape", false);
-		behavior.setOption("dialogClass", Options.asString("no-close"));
+		behavior.setOption("classes", "{'ui-dialog-titlebar': 'ui-corner-all no-close'}");
 		behavior.setOption("resizable", false);
 	}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
index 9306db1..b2fc869 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
@@ -39,6 +39,8 @@ import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.LanguageDropDown;
 import org.apache.openmeetings.web.util.CountryDropDown;
+import org.apache.openmeetings.web.util.NonClosableDialog;
+import org.apache.openmeetings.web.util.NonClosableMessageDialog;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
@@ -55,16 +57,12 @@ import org.apache.wicket.util.string.Strings;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
-import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
 import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
 import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
-public class RegisterDialog extends AbstractFormDialog<String> {
+public class RegisterDialog extends NonClosableDialog<String> {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(RegisterDialog.class, webAppRootKey);
 	private DialogButton cancelBtn = new DialogButton("cancel", Application.getString(122));
@@ -92,18 +90,10 @@ public class RegisterDialog extends AbstractFormDialog<String> {
 		form.setOutputMarkupId(true);
 		tzDropDown.setOutputMarkupId(true);
 
-		confirmRegistration = new MessageDialog("confirmRegistration", Application.getString(235),
-				Application.getString(674), DialogButtons.OK, DialogIcon.INFO) {
+		confirmRegistration = new NonClosableMessageDialog("confirmRegistration", Application.getString(235), Application.getString(674)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void onConfigure(JQueryBehavior behavior) {
-				super.onConfigure(behavior);
-				behavior.setOption("dialogClass", Options.asString("no-close"));
-				behavior.setOption("closeOnEscape", false);
-			}
-
-			@Override
 			public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
 				s.open(handler);
 			}
@@ -112,13 +102,6 @@ public class RegisterDialog extends AbstractFormDialog<String> {
 		reset();
 	}
 
-	@Override
-	public void onConfigure(JQueryBehavior behavior) {
-		super.onConfigure(behavior);
-		behavior.setOption("dialogClass", Options.asString("no-close"));
-		behavior.setOption("closeOnEscape", false);
-	}
-
 	public void setSignInDialog(SignInDialog s) {
 		this.s = s;
 	}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
index e0fefec..8346aa1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/ResetPasswordDialog.java
@@ -29,6 +29,8 @@ import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.util.NonClosableDialog;
+import org.apache.openmeetings.web.util.NonClosableMessageDialog;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
@@ -39,14 +41,11 @@ import org.apache.wicket.model.Model;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
 import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
 import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
-public class ResetPasswordDialog extends AbstractFormDialog<String> {
+public class ResetPasswordDialog extends NonClosableDialog<String> {
 	private static final long serialVersionUID = 1L;
 	private DialogButton resetBtn = new DialogButton("reset", Application.getString(327));
 	private Form<String> form;
@@ -101,18 +100,10 @@ public class ResetPasswordDialog extends AbstractFormDialog<String> {
 			}
 
 		});
-		confirmReset = new MessageDialog("confirmReset", Application.getString(325), Application.getString(332),
-				DialogButtons.OK, DialogIcon.INFO) {
+		confirmReset = new NonClosableMessageDialog("confirmReset", Application.getString(325), Application.getString(332)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void onConfigure(JQueryBehavior behavior) {
-				super.onConfigure(behavior);
-				behavior.setOption("dialogClass", Options.asString("no-close"));
-				behavior.setOption("closeOnEscape", false);
-			}
-
-			@Override
 			public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
 				setResponsePage(Application.get().getSignInPageClass());
 			}
@@ -124,8 +115,6 @@ public class ResetPasswordDialog extends AbstractFormDialog<String> {
 	public void onConfigure(JQueryBehavior behavior) {
 		super.onConfigure(behavior);
 		behavior.setOption("autoOpen", true);
-		behavior.setOption("dialogClass", Options.asString("no-close"));
-		behavior.setOption("closeOnEscape", false);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
index 186a72b..4349a8f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
@@ -42,6 +42,7 @@ import org.apache.openmeetings.web.app.OmAuthenticationStrategy;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.OmAjaxClientInfoBehavior;
 import org.apache.openmeetings.web.pages.HashPage;
+import org.apache.openmeetings.web.util.NonClosableDialog;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.RestartResponseException;
 import org.apache.wicket.ajax.AjaxEventBehavior;
@@ -72,11 +73,10 @@ import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.effect.JQueryEffectBehavior;
 import com.googlecode.wicket.jquery.ui.form.button.Button;
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
-public class SignInDialog extends AbstractFormDialog<String> {
+public class SignInDialog extends NonClosableDialog<String> {
 	private static final long serialVersionUID = 1L;
 	private Form<String> form;
 	private DialogButton loginBtn = new DialogButton("login", Application.getString(112));
@@ -107,8 +107,6 @@ public class SignInDialog extends AbstractFormDialog<String> {
 	public void onConfigure(JQueryBehavior behavior) {
 		super.onConfigure(behavior);
 		behavior.setOption("autoOpen", true);
-		behavior.setOption("closeOnEscape", false);
-		behavior.setOption("dialogClass", Options.asString("no-close"));
 		behavior.setOption("resizable", false);
 	}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
index 7b790da..0fdf955 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
@@ -135,7 +135,7 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 	public void onConfigure(JQueryBehavior behavior) {
 		super.onConfigure(behavior);
 		behavior.setOption("closeOnEscape", false);
-		behavior.setOption("dialogClass", Options.asString("no-close"));
+		behavior.setOption("classes", "{'ui-dialog-titlebar': 'ui-corner-all no-close'}");
 		behavior.setOption("resizable", false);
 	}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
index 094e38b..76879e5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/NicknameDialog.java
@@ -27,6 +27,7 @@ import java.util.List;
 import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.util.NonClosableDialog;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.validation.validator.RfcCompliantEmailAddressValidator;
 import org.apache.wicket.markup.html.form.Form;
@@ -37,11 +38,10 @@ import org.apache.wicket.util.string.Strings;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
-public class NicknameDialog extends AbstractFormDialog<User> {
+public class NicknameDialog extends NonClosableDialog<User> {
 	private static final long serialVersionUID = 1L;
 	private static final FastDateFormat TIME_DF = FastDateFormat.getInstance("HH:mm:ss");
 	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
@@ -72,8 +72,6 @@ public class NicknameDialog extends AbstractFormDialog<User> {
 	public void onConfigure(JQueryBehavior behavior) {
 		super.onConfigure(behavior);
 		behavior.setOption("autoOpen", isVisible(form.getModelObject()));
-		behavior.setOption("closeOnEscape", false);
-		behavior.setOption("dialogClass", Options.asString("no-close"));
 		behavior.setOption("resizable", false);
 	}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RedirectMessageDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RedirectMessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RedirectMessageDialog.java
index 9da7695..76bd5c5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RedirectMessageDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RedirectMessageDialog.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 
 import org.apache.directory.api.util.Strings;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.util.NonClosableMessageDialog;
 import org.apache.wicket.Component;
 import org.apache.wicket.RestartResponseException;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -30,26 +31,24 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.flow.RedirectToUrlException;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
-import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;
 
-public class RedirectMessageDialog extends MessageDialog {
+public class RedirectMessageDialog extends NonClosableMessageDialog {
 	private static final long serialVersionUID = 1L;
 	private final String labelId;
 	private final String url;
 	private final int delay = 5;
 	private final boolean autoOpen;
-	private Component label; 
-	
+	private Component label;
+
 	public RedirectMessageDialog(String id, String labelId, boolean autoOpen, String url) {
 		super(id, Application.getString(204), "", new ArrayList<DialogButton>(), DialogIcon.ERROR);
 		this.labelId = labelId;
 		this.url = url;
 		this.autoOpen = autoOpen;
 	}
-	
+
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
@@ -75,36 +74,34 @@ public class RedirectMessageDialog extends MessageDialog {
 			handler.add(label);
 		}
 	}
-	
+
 	@Override
 	protected void onOpen(IPartialPageRequestHandler handler) {
 		super.onOpen(handler);
 		startTimer(handler);
 	}
-	
+
 	@Override
 	public void onConfigure(JQueryBehavior behavior) {
 		super.onConfigure(behavior);
 		behavior.setOption("autoOpen", autoOpen);
-		behavior.setOption("closeOnEscape", false);
-		behavior.setOption("dialogClass", Options.asString("no-close"));
 		behavior.setOption("resizable", false);
 	}
-	
+
 	@Override
 	public boolean isModal() {
 		return true;
 	}
-	
+
 	@Override
 	public boolean isDefaultCloseEventEnabled() {
 		return false;
 	}
-	
+
 	@Override
 	public void onClose(IPartialPageRequestHandler handler, DialogButton button) {
 	}
-	
+
 	@Override
 	protected Component newLabel(String id, IModel<String> model) {
 		label = super.newLabel(id, model);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
index fd447d7..1fb06cc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
@@ -17,6 +17,7 @@
  * under the License.
  */
 function initVideo(_options) {
+	return; //commented until video is implemented
 	var options = $.extend({bgcolor: "#ffffff"
 		, resolutions: JSON.stringify([{label: "4:3 (~6 KByte/sec)", width: 40, height: 30}
 			, {label: "4:3 (~12 KByte/sec)", width: 80, height: 60}
@@ -37,7 +38,7 @@ function initVideo(_options) {
 	var type = 'application/x-shockwave-flash';
 	var src = 'public/main.swf?cache' + new Date().getTime();
 	var r = $('<div class="room video">').attr("id", "video" + options.uid);
-	var o = $('<object>').attr('type', type).attr('data', src);
+	var o = $('<object>').attr('type', type).attr('data', src).attr('width', 640).attr('height', 480);
 	o.append($('<param>').attr('name', 'quality').attr('value', 'best'))
 		.append($('<param>').attr('name', 'wmode').attr('value', 'transparent'))
 		.append($('<param>').attr('name', 'allowscriptaccess').attr('value', 'sameDomain'))
@@ -104,6 +105,7 @@ function roomLoad() {
 			setRoomSizes();
 		}
 	});
+	VideoSettings.init();
 	Wicket.Event.subscribe("/websocket/closed", roomClosed);
 }
 function roomUnload() {
@@ -112,12 +114,61 @@ function roomUnload() {
 	if (!!WbArea) {
 		WbArea.destroy();
 	}
+	VideoSettings.close();
 }
 function startPrivateChat(el) {
 	Chat.addTab('chatTab-u' + el.parent().parent().data("userid"), el.parent().parent().find('.user.name').text());
 	Chat.open();
 	$('#chatMessage .wysiwyg-editor').click();
 }
+var VideoSettings = (function() {
+	var self = {}, vs, lm;
+	function _init() {
+		vs = $('#video-settings');
+		lm = vs.find('.level-meter');
+		vs.dialog({
+			classes: {
+				'ui-dialog': 'ui-corner-all video'
+			}
+			, width: 640
+			, autoOpen: false
+			, buttons: [
+				{
+					text: vs.data('btn-save')
+					, icons: {
+						primary: "ui-icon-disk"
+					}
+					, click: function() {
+						vs.dialog("close");
+					}
+				}
+				, {
+					text: vs.data('btn-cancel')
+					, click: function() {
+						vs.dialog("close");
+					}
+				}
+			]
+		});
+		lm.progressbar({ value: 0 });
+		vs.find('button').button();
+	}
+	function _open(interview) {
+		var rr = vs.find('.cam-resolution').parent('.sett-row');
+		if (interview) {
+			rr.show();
+		} else {
+			rr.hide();
+		}
+		vs.dialog('open');
+	}
+	return {
+		init: _init
+		, open: _open
+		, close: function() { vs.dialog('close'); }
+	};
+})();
+
 /***** functions required by SIP   ******/
 function sipBtnClick() {
 	var txt = $('.sip-number');

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
index a174b10..9e5b7ac 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
@@ -40,5 +40,72 @@
 	<form wicket:id="form"><div wicket:id="confirm-trash"></div></form>
 	<div wicket:id="upload"></div>
 	<div wicket:id="confirm-kick" />
+	<div id="video-settings" wicket:message="title:51, data-btn-save:144, data-btn-cancel:25" style="display:none;">
+		<div class="title"><wicket:message key="758"/></div>
+		<div class="sett-container">
+			<div class="opt-block">
+				<div class="sett-row">
+					<div><wicket:message key="52"/></div>
+					<div>
+						<select class="cam">
+							<option value="-1"><wicket:message key="159"/></option>
+						</select>
+					</div>
+				</div>
+				<div class="sett-row">
+					<div><wicket:message key="53"/></div>
+					<div>
+						<select class="mic">
+							<option value="-1"><wicket:message key="159"/></option>
+						</select>
+					</div>
+				</div>
+				<div class="sett-row">
+					<div class="clear">
+						<wicket:message key="1429"/>
+						<span class="warn ui-state-highlight" wicket:message="title:1430">
+							<span class="ui-icon ui-icon-alert"></span>
+						</span>
+					</div>
+					<div>
+						<select class="cam-resolution">
+							<option value="1" data-width="40" data-height="30">40x30 [4:3 (~6 KByte/sec)]</option>
+							<option value="2" data-width="80" data-height="60">80x60 [4:3 (~12 KByte/sec)]</option>
+							<option value="3" data-width="120" data-height="90" selected="selected">120x90 [4:3 (~20 KByte/sec)]</option>
+							<option value="4" data-width="160" data-height="120">160x120 [QQVGA 4:3 (~36 KByte/sec)]</option>
+							<option value="5" data-width="240" data-height="180">240x180 [4:3 (~40 KByte/sec)]</option>
+							<option value="6" data-width="320" data-height="240">320x240 [HVGA 4:3 (~56 KByte/sec)]</option>
+							<option value="7" data-width="480" data-height="360">480x360 [4:3  (~60 KByte/sec)]</option>
+							<option value="8" data-width="640" data-height="480">640x480 [4:3 (~68 KByte/sec)]</option>
+							<option value="9" data-width="1024" data-height="768">1024x768 [XGA 4:3]</option>
+							<option value="10" data-width="256" data-height="150">256x150 [16:9]</option>
+							<option value="11" data-width="432" data-height="240">432x240 [WQVGA 9:5]</option>
+							<option value="12" data-width="480" data-height="234">480x234 [pseudo 16:9]</option>
+							<option value="13" data-width="512" data-height="300">512x300 [16:9]</option>
+							<option value="14" data-width="640" data-height="360">640x360 [nHD 16:9]</option>
+							<option value="15" data-width="1024" data-height="600">1024x600 [16:9]</option>
+						</select>
+					</div>
+				</div>
+				<div class="sett-row">
+					<div class="align-right"><button><wicket:message key="775"/></button></div>
+				</div>
+			</div>
+			<div class="vid-block">
+				<div>
+				</div>
+				<div class="level-meter"></div>
+				<div class="sett-row">
+					<div class="align-right"><button><wicket:message key="764"/></button></div>
+				</div>
+			</div>
+		</div>
+		<div>
+			<span style="padding: 5px;">
+				<span class="ui-icon ui-icon-info"></span>
+			</span>
+			<wicket:message key="765"/>
+		</div>
+	</div>
 </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java
index 566dae5..0c9f020 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java
@@ -24,7 +24,7 @@ import org.apache.openmeetings.web.room.RoomPanel;
 
 public class SettingsIcon extends ClientIcon {
 	private static final long serialVersionUID = 1L;
-	
+
 	public SettingsIcon(String id, Client client, RoomPanel room) {
 		super(id, client, room);
 		mainCssClass = "settings ";
@@ -42,6 +42,6 @@ public class SettingsIcon extends ClientIcon {
 
 	@Override
 	protected String getScript() {
-		return String.format("document.getElementById('lzapp').showAvSettings(%s);", Room.Type.interview == room.getRoom().getType());
+		return String.format("VideoSettings.open(%s);", Room.Type.interview == room.getRoom().getType());
 	}
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
index 4f3762a..47e6fd4 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
@@ -18,11 +18,17 @@
  */
 package org.apache.openmeetings.web.room.wb;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.wicket.AttributeModifier.append;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
 import java.util.Arrays;
 import java.util.Map.Entry;
 import java.util.UUID;
@@ -35,7 +41,9 @@ import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dto.room.Whiteboard;
 import org.apache.openmeetings.db.dto.room.Whiteboards;
 import org.apache.openmeetings.db.entity.basic.Client;
+import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.util.OmFileHelper;
@@ -63,12 +71,16 @@ import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.resource.FileSystemResourceReference;
 import org.apache.wicket.util.string.StringValue;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
 
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
+import com.github.openjson.JSONTokener;
 
 public class WbPanel extends Panel {
 	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(WbPanel.class, webAppRootKey);
 	private static final int UPLOAD_WB_LEFT = 0;
 	private static final int UPLOAD_WB_TOP = 0;
 	private static final int DEFAULT_WIDTH = 640;
@@ -126,19 +138,19 @@ public class WbPanel extends Panel {
 							break;
 						case removeWb:
 						{
-							long _id = obj.optLong("id", -1);
+							long _id = obj.optLong("wbId", -1);
 							Long id = _id < 0 ? null : _id;
 							getBean(WhiteboardCache.class).remove(roomId, id);
-							sendWbAll(Action.removeWb, new JSONObject().put("id", id));
+							sendWbAll(Action.removeWb, obj);
 						}
 							break;
 						case activateWb:
 						{
-							long _id = obj.optLong("id", -1);
+							long _id = obj.optLong("wbId", -1);
 							if (_id > -1) {
 								Whiteboards wbs = getBean(WhiteboardCache.class).get(roomId);
 								wbs.setActiveWb(_id);
-								sendWbAll(Action.activateWb, new JSONObject().put("id", _id));
+								sendWbAll(Action.activateWb, obj);
 							}
 						}
 							break;
@@ -185,8 +197,7 @@ public class WbPanel extends Panel {
 						case clearAll:
 						{
 							Whiteboard wb = getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
-							wb.clear();
-							sendWbAll(Action.clearAll, obj);
+							clearAll(wb);
 						}
 							break;
 						case clearSlide:
@@ -213,7 +224,19 @@ public class WbPanel extends Panel {
 		@Override
 		protected void onSubmit(AjaxRequestTarget target) {
 			Whiteboard wb = getBean(WhiteboardCache.class).get(roomId).get(wb2save);
-			wb.toJson();
+			FileExplorerItem f = new FileExplorerItem();
+			f.setType(Type.WmlFile);
+			f.setRoomId(roomId);
+			f.setHash(UUID.randomUUID().toString());
+			f.setName(getModelObject());
+			f = getBean(FileExplorerItemDao.class).update(f);
+			try (BufferedWriter writer = Files.newBufferedWriter(f.getFile().toPath())) {
+				writer.write(wb.toJson().toString(2));
+			} catch (IOException e) {
+				error("Unexpected error while saving WB: " + e.getMessage());
+				target.add(feedback);
+				log.error("Unexpected error while saving WB", e);
+			}
 		}
 
 		@Override
@@ -274,7 +297,7 @@ public class WbPanel extends Panel {
 			}
 			sb.append("WbArea.load(").append(getObjWbJson(entry.getKey(), arr).toString()).append(");");
 		}
-		sb.append("WbArea.activateWb({id: ").append(wbs.getActiveWb()).append("});");
+		sb.append("WbArea.activateWb({wbId: ").append(wbs.getActiveWb()).append("});");
 		response.render(OnDomReadyHeaderItem.forScript(sb));
 	}
 
@@ -289,23 +312,18 @@ public class WbPanel extends Panel {
 	private void sendWb(Action meth, JSONObject obj, Predicate<Client> check) {
 		WebSocketHelper.sendRoom(
 				roomId
-				, new JSONObject()
-						.put("type", "wb")
+				, new JSONObject().put("type", "wb")
 				, check
 				, (o, c) -> o.put("func", String.format("WbArea.%s(%s);", meth.name(), obj.toString())).toString()
 			);
 	}
 
 	private static JSONObject getObjWbJson(Long wbId, Object o) {
-		return new JSONObject()
-				.put("wbId", wbId)
-				.put(PARAM_OBJ, o);
+		return new JSONObject().put("wbId", wbId).put(PARAM_OBJ, o);
 	}
 
 	private static JSONObject getAddWbJson(Long id, String name) {
-		return new JSONObject()
-				.put("id", id)
-				.put("name", name);
+		return new JSONObject().put("wbId", id).put("name", name);
 	}
 
 	public boolean isReadOnly() {
@@ -327,7 +345,7 @@ public class WbPanel extends Panel {
 
 	private JSONObject addFileUrl(String ruid, JSONObject _file) {
 		try {
-		final long fid = _file.optLong("fileId", -1);
+			final long fid = _file.optLong("fileId", -1);
 			if (fid > 0) {
 				FileItem fi = FileItem.Type.Recording.name().equals(_file.optString("fileType"))
 						? getBean(RecordingDao.class).get(fid)
@@ -371,72 +389,78 @@ public class WbPanel extends Panel {
 		return file;
 	}
 
-	/*
-	 * OLD VERSION
-	 *
-	public void sendFileToWb(FileItem fi, boolean clean) {
-		if (wb.isVisible() && fi.getId() != null && FileItem.Type.Folder != fi.getType()) {
-			long activeWbId = -1;
-			if (FileItem.Type.WmlFile == fi.getType()) {
-				getBean(ConferenceLibrary.class).sendToWhiteboard(getClient().getUid(), activeWbId, fi);
-			} else {
-				String url = null;
-				PageParameters pp = new PageParameters();
-				pp.add("id", fi.getId())
-					.add("ruid", getBean(WhiteboardCache.class).get(r.getId()).getUid());
-				switch (fi.getType()) {
-					case Video:
-						pp.add("preview", true);
-						url = urlFor(new RoomResourceReference(), pp).toString();
-						break;
-					case Recording:
-						url = urlFor(new JpgRecordingResourceReference(), pp).toString();
-						break;
-					default:
-						url = urlFor(new RoomResourceReference(), pp).toString();
-						break;
-				}
-				getBean(ScopeApplicationAdapter.class).sendToWhiteboard(getClient().getUid(), activeWbId, fi, url, clean);
-			}
-		}
+	private void clearAll(Whiteboard wb) {
+		wb.clear();
+		sendWbAll(Action.clearAll, new JSONObject().put("wbId", wb.getId()));
 	}
-	 */
 
 	public void sendFileToWb(FileItem fi, boolean clean) {
-		if (isVisible() && fi.getId() != null && FileItem.Type.Folder != fi.getType()) {
-			//FIXME TODO WmlFile/Chart special handling
+		if (isVisible() && fi.getId() != null) {
 			Whiteboards wbs = getBean(WhiteboardCache.class).get(roomId);
 			String wuid = UUID.randomUUID().toString();
 			Whiteboard wb = wbs.get(wbs.getActiveWb());
-			//FIXME TODO various types
-			JSONObject file = new JSONObject()
-					.put("fileId", fi.getId())
-					.put("fileType", fi.getType().name())
-					.put("count", fi.getCount())
-					.put("type", "image")
-					.put("left", UPLOAD_WB_LEFT)
-					.put("top", UPLOAD_WB_TOP)
-					.put("width", fi.getWidth() == null ? DEFAULT_WIDTH : fi.getWidth())
-					.put("height", fi.getHeight() == null ? DEFAULT_HEIGHT : fi.getHeight())
-					.put("uid", wuid)
-					.put("slide", wb.getSlide())
-					;
-			wb.put(wuid, file);
-			final String ruid = wbs.getUid();
-			if (clean) {
-				sendWbAll(Action.clearAll, new JSONObject().put("wbId", wb.getId()));
-			}
-			WebSocketHelper.sendRoom(
-					roomId
-					, new JSONObject().put("type", "wb")
-					, null
-					, (o, c) -> {
-							return o.put("func", String.format("WbArea.%s(%s);"
-									, Action.createObj.name()
-									, getObjWbJson(wb.getId(), addFileUrl(ruid, file, fi, c)).toString())
-								).toString();
+			switch (fi.getType()) {
+				case Folder:
+					//do nothing
+					break;
+				case WmlFile:
+				{
+					File f = fi.getFile();
+					if (f.exists() && f.isFile()) {
+						try (BufferedReader br = Files.newBufferedReader(f.toPath())) {
+							JSONObject wbo = new JSONObject(new JSONTokener(br));
+							/*WebSocketHelper.sendRoom(
+									roomId
+									, new JSONObject().put("type", "wb")
+									, null
+									, (o, c) -> {
+											return o.put("func", String.format("WbArea.%s(%s);"
+													, Action.createObj.name()
+													, getObjWbJson(wb.getId(), addFileUrl(ruid, file, fi, c)).toString())
+												).toString();
+										}
+									);*/
+						} catch (IOException e) {
+							log.error("Unexpected error while loading WB", e);
 						}
-					);
+					}
+				}
+					break;
+				case PollChart:
+					break;
+				default:
+				{
+					JSONObject file = new JSONObject()
+							.put("fileId", fi.getId())
+							.put("fileType", fi.getType().name())
+							.put("count", fi.getCount())
+							.put("type", "image")
+							.put("left", UPLOAD_WB_LEFT)
+							.put("top", UPLOAD_WB_TOP)
+							.put("width", fi.getWidth() == null ? DEFAULT_WIDTH : fi.getWidth())
+							.put("height", fi.getHeight() == null ? DEFAULT_HEIGHT : fi.getHeight())
+							.put("uid", wuid)
+							.put("slide", wb.getSlide())
+							;
+					wb.put(wuid, file);
+					final String ruid = wbs.getUid();
+					if (clean) {
+						clearAll(wb);
+					}
+					WebSocketHelper.sendRoom(
+							roomId
+							, new JSONObject().put("type", "wb")
+							, null
+							, (o, c) -> {
+									return o.put("func", String.format("WbArea.%s(%s);"
+											, Action.createObj.name()
+											, getObjWbJson(wb.getId(), addFileUrl(ruid, file, fi, c)).toString())
+										).toString();
+								}
+							);
+				}
+					break;
+			}
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
index d2da4dd..f580f19 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
@@ -1085,6 +1085,15 @@ var WbArea = (function() {
 		});
 		wbTabs.find(".ui-tabs-panel .scroll-container").height(wbah);
 	}
+	function _addCloseBtn(li) {
+		if (readOnly) {
+			return;
+		}
+		li.append($('#wb-tab-close').clone().attr('id', ''));
+		li.find('button').click(function() {
+			wbAction('removeWb', JSON.stringify({wbId: li.data().wbId}));
+		});
+	}
 	self.getWbTabId = function(id) {
 		return "wb-tab-" + id;
 	};
@@ -1122,10 +1131,8 @@ var WbArea = (function() {
 					scroll.scrollLeft(scroll.scrollLeft() + 30);
 				});
 				tabsNav.find('li').each(function(idx) {
-					$(this).append($('#wb-tab-close').clone().attr('id', ''));
-					$(this).find('button').click(function() {
-						wbAction('removeWb', JSON.stringify({id: obj.id}));
-					});
+					var li = $(this);
+					_addCloseBtn(li);
 				});
 				$(window).keyup(deleteHandler);
 			}
@@ -1145,7 +1152,7 @@ var WbArea = (function() {
 				return res;
 			}
 			, activate: function(e, ui) {
-				wbAction('activateWb', JSON.stringify({id: ui.newTab.data('wb-id')}));
+				wbAction('activateWb', JSON.stringify({wbId: ui.newTab.data('wb-id')}));
 			}
 		});
 		scroll = tabs.find('.scroll-container');
@@ -1162,26 +1169,28 @@ var WbArea = (function() {
 		$(window).off('keyup', deleteHandler);
 	};
 	self.create = function(obj) {
-		var tid = self.getWbTabId(obj.id)
-			, li = $('#wb-area-tab').clone().attr('id', '').data('wb-id', obj.id)
+		var tid = self.getWbTabId(obj.wbId)
+			, li = $('#wb-area-tab').clone().attr('id', '').data('wb-id', obj.wbId)
 			, wb = $('#wb-area').clone().attr('id', tid);
 		li.find('a').text(obj.name).attr('title', obj.name).attr('href', "#" + tid);
 	
 		tabs.find(".ui-tabs-nav").append(li);
 		tabs.append(wb);
 		refreshTabs();
+		_addCloseBtn(li);
 	
 		var wbo = Wb();
 		wb.data(wbo);
-		wbo.init(obj.id, tid, readOnly);
+		wbo.init(obj.wbId, tid, readOnly);
 		_resizeWbs();
 	}
 	self.createWb = function(obj) {
 		self.create(obj);
-		_activateTab(obj.id);
+		self.setReadOnly(readOnly);
+		_activateTab(obj.wbId);
 	};
 	self.activateWb = function(obj) {
-		_activateTab(obj.id);
+		_activateTab(obj.wbId);
 	}
 	self.load = function(json) {
 		self.getWb(json.wbId).load(json.obj);
@@ -1206,7 +1215,7 @@ var WbArea = (function() {
 		self.getWb(json.wbId).clearSlide(json.slide);
 	};
 	self.removeWb = function(obj) {
-		var tabId = self.getWbTabId(obj.id);
+		var tabId = self.getWbTabId(obj.wbId);
 		tabs.find('li[aria-controls="' + tabId + '"]').remove();
 		$("#" + tabId).remove();
 		refreshTabs();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index bb7e55a..e468e36 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -129,7 +129,7 @@ public class AppointmentDialog extends AbstractFormDialog<Appointment> {
 	@Override
 	public void onConfigure(JQueryBehavior behavior) {
 		super.onConfigure(behavior);
-		behavior.setOption("dialogClass", Options.asString("appointment"));
+		behavior.setOption("classes", "{'ui-dialog': 'ui-corner-all appointment'}");
 	}
 
 	public void setModelObjectWithAjaxTarget(Appointment a, AjaxRequestTarget target) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/NonClosableDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/NonClosableDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/NonClosableDialog.java
new file mode 100644
index 0000000..8f8a5ec
--- /dev/null
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/NonClosableDialog.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.util;
+
+import java.io.Serializable;
+
+import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+
+public abstract class NonClosableDialog<T extends Serializable> extends AbstractFormDialog<T> {
+	private static final long serialVersionUID = 1L;
+
+	public NonClosableDialog(String id, String title) {
+		super(id, title);
+	}
+
+	@Override
+	public void onConfigure(JQueryBehavior behavior) {
+		super.onConfigure(behavior);
+		behavior.setOption("closeOnEscape", false);
+		behavior.setOption("classes", "{'ui-dialog-titlebar': 'ui-corner-all no-close'}");
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/NonClosableMessageDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/NonClosableMessageDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/NonClosableMessageDialog.java
new file mode 100644
index 0000000..2778268
--- /dev/null
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/NonClosableMessageDialog.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.util;
+
+import java.util.List;
+
+import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogIcon;
+import com.googlecode.wicket.jquery.ui.widget.dialog.MessageDialog;;
+
+public abstract class NonClosableMessageDialog extends MessageDialog {
+	private static final long serialVersionUID = 1L;
+
+	public NonClosableMessageDialog(String id, String title, String message) {
+		super(id, title, message, DialogButtons.OK, DialogIcon.INFO);
+	}
+
+	public NonClosableMessageDialog(String id, String title, String message, List<DialogButton> buttons, DialogIcon icon) {
+		super(id, title, message, buttons, icon);
+	}
+
+	@Override
+	public void onConfigure(JQueryBehavior behavior) {
+		super.onConfigure(behavior);
+		behavior.setOption("classes", "{'ui-dialog-titlebar': 'ui-corner-all no-close'}");
+		behavior.setOption("closeOnEscape", false);
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/35544aaf/openmeetings-web/src/main/webapp/css/room.css
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/css/room.css b/openmeetings-web/src/main/webapp/css/room.css
index cfbe13c..18f6f4c 100644
--- a/openmeetings-web/src/main/webapp/css/room.css
+++ b/openmeetings-web/src/main/webapp/css/room.css
@@ -356,6 +356,43 @@
 	padding: 0;
 	overflow: hidden;
 }
+.ui-dialog.video .ui-dialog-titlebar {
+	padding-left:10px
+}
+.ui-dialog.video .title {
+	font-weight: bold;
+}
+.ui-dialog.video .opt-block {
+	width: 300px;
+	display: inline-block;
+	position: absolute;
+	top: 0;
+	left: 0;
+}
+.ui-dialog.video .vid-block {
+	min-width: 300px;
+	padding-left: 305px;
+}
+.ui-dialog.video .level-meter {
+	height: 16px;
+}
+.ui-dialog.video .warn {
+	float: right;
+	margin-right: .3em;
+}
+.ui-dialog.video .level-meter .ui-progressbar-value {
+	background: greenyellow;
+}
+.ui-dialog.video .sett-container {
+	position: relative;
+	min-height: 200px;
+}
+.ui-dialog.video .sett-row {
+	padding-top: 10px;
+}
+.ui-dialog.video .sett-row select, .ui-dialog.video .level-meter {
+	width: 250px;
+}
 .input .select2-container {
 	max-height: 100px;
 	overflow-y: auto;