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/12 17:17:42 UTC

svn commit: r1791161 - in /openmeetings/application/trunk: ./ openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/ openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ openmeetings-core/src/main/java/org/apache/...

Author: solomax
Date: Wed Apr 12 17:17:42 2017
New Revision: 1791161

URL: http://svn.apache.org/viewvc?rev=1791161&view=rev
Log:
[OPENMEETINGS-551] hash?swf=settings is fixed, code clean-up

Added:
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
      - copied, changed from r1791160, openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
Removed:
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
Modified:
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
    openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
    openmeetings/application/trunk/openmeetings-server/src/site/xdoc/Clustering.xml
    openmeetings/application/trunk/openmeetings-server/src/site/xdoc/voip-sip-integration.xml
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/red5-web.xml
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/web.xml
    openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractSpringTest.java
    openmeetings/application/trunk/pom.xml

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java Wed Apr 12 17:17:42 2017
@@ -21,24 +21,14 @@ package org.apache.openmeetings.core.rem
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
-import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager;
 import org.apache.openmeetings.core.documents.LibraryChartLoader;
 import org.apache.openmeetings.core.documents.LibraryDocumentConverter;
-import org.apache.openmeetings.core.documents.LibraryWmlLoader;
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
-import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.dto.server.ClientSessionInfo;
 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.Client;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.util.OmFileHelper;
@@ -57,17 +47,11 @@ public class ConferenceLibrary implement
 	private static final Logger log = Red5LoggerFactory.getLogger(ConferenceLibrary.class, webAppRootKey);
 
 	@Autowired
-	private ISessionManager sessionManager;
-	@Autowired
 	private SessiondataDao sessionDao;
 	@Autowired
 	private UserDao userDao;
 	@Autowired
 	private FileExplorerItemDao fileDao;
-	@Autowired
-	private WhiteboardManager whiteboardManager;
-	@Autowired
-	private ScopeApplicationAdapter scopeAdapter;
 
 	/**
 	 *
@@ -106,53 +90,6 @@ public class ConferenceLibrary implement
 	}
 
 	/**
-	 * Loads a Object from the library into the whiteboard of all participant of
-	 * the current room
-	 *
-	 * @param uid - uid of the client performing operation
-	 * @param wbId - id of whiteboard
-	 * @param fi - FileItem of the Wml being loaded
-	 */
-	public void sendToWhiteboard(String uid, Long wbId, FileItem fi) {
-		ClientSessionInfo csi = sessionManager.getClientByPublicSIDAnyServer(uid);
-		if (csi == null) {
-			log.warn("No client was found to send Wml:: {}", uid);
-			return;
-		}
-		Client client = csi.getRcl();
-
-		if (client == null) {
-			log.warn("No client was found to send Wml:: {}", uid);
-			return;
-		}
-
-		List<?> roomItems = LibraryWmlLoader.loadWmlFile(fi.getHash());
-
-		Map<Integer, Object> wbClear = new HashMap<>();
-		wbClear.put(2, "clear");
-		wbClear.put(3, null);
-
-		Long roomId = client.getRoomId();
-		whiteboardManager.add(roomId, wbClear, wbId);
-
-		for (int k = 0; k < roomItems.size(); k++) {
-			List<?> actionObject = (List<?>)roomItems.get(k);
-
-			Map<Integer, Object> whiteboardObj = new HashMap<>();
-			whiteboardObj.put(2, "draw");
-			whiteboardObj.put(3, actionObject);
-
-			whiteboardManager.add(roomId, whiteboardObj, wbId);
-		}
-
-		Map<String, Object> sendObject = new HashMap<>();
-		sendObject.put("id", wbId);
-		sendObject.put("roomitems", roomItems);
-
-		scopeAdapter.sendToScope(roomId, "loadWmlToWhiteboardById", sendObject);
-	}
-
-	/**
 	 *
 	 * Loads a chart object
 	 *

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java Wed Apr 12 17:17:42 2017
@@ -18,41 +18,15 @@
  */
 package org.apache.openmeetings.core.remote;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE_KEY;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
-import org.apache.openmeetings.core.remote.util.SessionVariablesUtil;
-import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
-import org.apache.openmeetings.db.dao.log.ConferenceLogDao;
-import org.apache.openmeetings.db.dao.room.RoomDao;
-import org.apache.openmeetings.db.dao.server.ISessionManager;
-import org.apache.openmeetings.db.dao.server.SessiondataDao;
-import org.apache.openmeetings.db.dao.user.IUserManager;
-import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
-import org.apache.openmeetings.db.entity.log.ConferenceLog;
-import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.RoomGroup;
-import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.db.entity.user.User.Right;
-import org.apache.openmeetings.db.entity.user.Userdata;
-import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.red5.logging.Red5LoggerFactory;
-import org.red5.server.api.IConnection;
-import org.red5.server.api.Red5;
 import org.red5.server.api.service.IPendingServiceCall;
 import org.red5.server.api.service.IPendingServiceCallback;
 import org.slf4j.Logger;
@@ -67,63 +41,11 @@ public class MainService implements IPen
 	private static final Logger log = Red5LoggerFactory.getLogger(MainService.class, OpenmeetingsVariables.webAppRootKey);
 
 	@Autowired
-	private ISessionManager sessionManager;
-	@Autowired
-	private ScopeApplicationAdapter scopeApplicationAdapter;
-	@Autowired
-	private SessiondataDao sessionDao;
-	@Autowired
-	private ConfigurationDao configurationDao;
-	@Autowired
-	private IUserManager userManager;
-	@Autowired
-	private ConferenceLogDao conferenceLogDao;
-	@Autowired
-	private UserDao userDao;
-	@Autowired
-	private RoomDao roomDao;
-	@Autowired
 	private AppointmentDao appointmentDao;
 
 	// External User Types
 	public static final String EXTERNAL_USER_TYPE_LDAP = "LDAP";
 
-
-	/**
-	 * gets a user by its SID
-	 *
-	 * @param sid
-	 * @param userId
-	 * @return - user with SID given
-	 */
-	public User getUser(String sid, long userId) {
-		User users = new User();
-		Sessiondata sd = sessionDao.check(sid);
-		Set<Right> rights = userDao.getRights(sd.getUserId());
-		if (AuthLevelUtil.hasAdminLevel(rights) || AuthLevelUtil.hasWebServiceLevel(rights)) {
-			users = userDao.get(userId);
-		} else {
-			users.setFirstname("No rights to do this");
-		}
-		return users;
-	}
-
-	public Client getCurrentRoomClient(String SID) {
-		try {
-			IConnection current = Red5.getConnectionLocal();
-			String streamid = current.getClient().getId();
-
-			log.debug("getCurrentRoomClient -1- " + SID);
-			log.debug("getCurrentRoomClient -2- " + streamid);
-
-			Client currentClient = sessionManager.getClientByStreamId(streamid, null);
-			return currentClient;
-		} catch (Exception err) {
-			log.error("[getCurrentRoomClient]", err);
-		}
-		return null;
-	}
-
 	public boolean isRoomAllowedToUser(Room r, User u) {
 		boolean allowed = false;
 		if (r != null) {
@@ -172,93 +94,6 @@ public class MainService implements IPen
 		return allowed;
 	}
 
-	public List<Object> loginWicket(String wicketSID, Long wicketroomid) {
-		log.debug("[loginWicket] wicketSID: '{}'; wicketroomid: '{}'", wicketSID, wicketroomid);
-		Sessiondata sd = sessionDao.check(wicketSID);
-		Long userId = sd.getUserId();
-		User u = userId == null ? null : userDao.get(userId);
-		Room r = roomDao.get(wicketroomid);
-		if (u != null && r != null) {
-			log.debug("[loginWicket] user and roomid are not empty: " + userId + ", " + wicketroomid);
-			if (wicketroomid.equals(sd.getRoomId()) || isRoomAllowedToUser(r, u)) {
-				IConnection current = Red5.getConnectionLocal();
-				String streamId = current.getClient().getId();
-				Client currentClient = sessionManager.getClientByStreamId(streamId, null);
-
-				if (User.Type.user != u.getType() || (User.Type.user == u.getType() && !u.getGroupUsers().isEmpty())) {
-					u.setSessionData(sd);
-					currentClient.setUserId(u.getId());
-					currentClient.setRoomId(wicketroomid);
-					SessionVariablesUtil.setUserId(current.getClient(), u.getId());
-
-					currentClient.setUsername(u.getLogin());
-					currentClient.setFirstname(u.getFirstname());
-					currentClient.setLastname(u.getLastname());
-					currentClient.setPicture_uri(u.getPictureuri());
-					currentClient.setEmail(u.getAddress() == null ? null : u.getAddress().getEmail());
-					sessionManager.updateClientByStreamId(streamId, currentClient, false, null);
-
-					scopeApplicationAdapter.sendMessageToCurrentScope("roomConnect", currentClient, false);
-
-					return Arrays.<Object>asList(u, r);
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Function is called if the user loggs in via a secureHash and sets the
-	 * param showNickNameDialog in the Object SOAPLogin to true the user gets
-	 * displayed an additional dialog to enter his nickname
-	 *
-	 * @param firstname
-	 * @param lastname
-	 * @param email
-	 * @return - 1 in case of success, -1 otherwise
-	 */
-	public Long setUserNickName(String firstname, String lastname, String email) {
-		try {
-			IConnection current = Red5.getConnectionLocal();
-			String streamId = current.getClient().getId();
-			Client currentClient = sessionManager.getClientByStreamId(streamId, null);
-
-			currentClient.setFirstname(firstname);
-			currentClient.setLastname(lastname);
-			currentClient.setEmail(email);
-
-			// Log the User
-			conferenceLogDao.add(
-					ConferenceLog.Type.nicknameEnter, currentClient.getUserId(), streamId,
-					null, currentClient.getUserip(), currentClient.getScope());
-
-			sessionManager.updateClientByStreamId(streamId, currentClient, false, null);
-			scopeApplicationAdapter.sendMessageToCurrentScope("nickNameSet", currentClient, true);
-
-			return 1L;
-		} catch (Exception err) {
-			log.error("[setUserNickName] ", err);
-		}
-		return new Long(-1);
-	}
-
-	public List<Configuration> getGeneralOptions() {
-		try {
-			return configurationDao.get("exclusive.audio.keycode", CONFIG_SIP_ENABLED, CONFIG_MAX_UPLOAD_SIZE_KEY, "mute.keycode", CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY);
-		} catch (Exception err) {
-			log.error("[getGeneralOptions]",err);
-		}
-		return null;
-	}
-
-	public List<Userdata> getUserdata(String sid) {
-		Sessiondata sd = sessionDao.check(sid);
-		if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) {
-			return userManager.getUserdataDashBoard(sd.getUserId());
-		}
-		return null;
-	}
-
 	@Override
 	public void resultReceived(IPendingServiceCall arg0) {
 		log.debug("[resultReceived]" + arg0);

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Wed Apr 12 17:17:42 2017
@@ -18,18 +18,15 @@
  */
 package org.apache.openmeetings.core.remote.red5;
 
-import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE_PROXY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_VIDEO_CODEC;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
-import java.awt.Point;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -42,11 +39,8 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.data.conference.RoomManager;
-import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
-import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager;
 import org.apache.openmeetings.core.remote.RecordingService;
 import org.apache.openmeetings.core.remote.util.SessionVariablesUtil;
 import org.apache.openmeetings.core.util.WebSocketHelper;
@@ -62,8 +56,6 @@ import org.apache.openmeetings.db.dao.se
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.room.BrowserStatus;
 import org.apache.openmeetings.db.dto.room.RoomStatus;
-import org.apache.openmeetings.db.dto.server.ClientSessionInfo;
-import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.log.ConferenceLog;
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -105,15 +97,16 @@ public class ScopeApplicationAdapter ext
 	private static final String SECURITY_CODE_PARAM = "securityCode";
 	private static final String WIDTH_PARAM = "width";
 	private static final String HEIGHT_PARAM = "height";
-	private static final String NATIVE_SSL_PARAM = "nativeSsl";
+	public static final String FLASH_SECURE = "secure";
+	public static final String FLASH_NATIVE_SSL = "native";
+	public static final String FLASH_PORT = "rtmpPort";
+	public static final String FLASH_SSL_PORT = "rtmpsPort";
+	public static final String FLASH_VIDEO_CODEC = "videoCodec";
+	public static final String FLASH_FPS = "fps";
 
 	@Autowired
 	private ISessionManager sessionManager;
 	@Autowired
-	private WhiteboardManager whiteboardManager;
-	@Autowired
-	private WhiteboardCache whiteboardCache;
-	@Autowired
 	private RecordingService recordingService;
 	@Autowired
 	private ConfigurationDao cfgDao;
@@ -161,12 +154,12 @@ public class ScopeApplicationAdapter ext
 				props.load(is);
 			}
 			flashSettings = new JSONObject()
-					.put("secure", "yes".equals(cfgDao.getConfValue(CONFIG_FLASH_SECURE, String.class, "no")))
-					.put("proxyType", cfgDao.getConfValue(CONFIG_FLASH_SECURE_PROXY, String.class, "none"))
-					.put("rtmpPort", props.getProperty("rtmp.port"))
-					.put("rtmpsPort", props.getProperty("rtmps.port"))
-					.put("videoCodec", cfgDao.getConfValue(CONFIG_FLASH_VIDEO_CODEC, String.class, "h263"))
-					.put("fps", cfgDao.getConfValue(OpenmeetingsVariables.CONFIG_FLASH_VIDEO_FPS, Integer.class, "30"))
+					.put(FLASH_SECURE, "yes".equals(cfgDao.getConfValue(CONFIG_FLASH_SECURE, String.class, "no")))
+					.put(FLASH_NATIVE_SSL, "best".equals(cfgDao.getConfValue(CONFIG_FLASH_SECURE_PROXY, String.class, "none")))
+					.put(FLASH_PORT, props.getProperty("rtmp.port"))
+					.put(FLASH_SSL_PORT, props.getProperty("rtmps.port"))
+					.put(FLASH_VIDEO_CODEC, cfgDao.getConfValue(CONFIG_FLASH_VIDEO_CODEC, String.class, "h263"))
+					.put(FLASH_FPS, cfgDao.getConfValue(OpenmeetingsVariables.CONFIG_FLASH_VIDEO_FPS, Integer.class, "30"))
 					;
 
 			for (String scopeName : scope.getScopeNames()) {
@@ -307,7 +300,6 @@ public class ScopeApplicationAdapter ext
 		rcm.setUserip(conn.getRemoteAddress());
 		rcm.setSwfurl(swfURL);
 		rcm.setTcUrl(tcUrl);
-		rcm.setNativeSsl(Boolean.TRUE.equals(connParams.get(NATIVE_SSL_PARAM)));
 		if (!Strings.isEmpty(uid)) {
 			rcm.setPublicSID(uid);
 		}
@@ -1151,212 +1143,6 @@ public class ScopeApplicationAdapter ext
 		return null;
 	}
 
-	/**
-	 * This Function is triggered from the Whiteboard
-	 *
-	 * @param whiteboardObjParam - array of parameters being sended to whiteboard
-	 * @param whiteboardId - id of whiteboard parameters will be send to
-	 * @return 1 in case of no errors, -1 otherwise
-	 */
-	public int sendVarsByWhiteboardId(List<?> whiteboardObjParam, Long whiteboardId) {
-		try {
-			IConnection current = Red5.getConnectionLocal();
-			Client client = sessionManager.getClientByStreamId(current.getClient().getId(), null);
-			return sendToWhiteboard(client, whiteboardObjParam, whiteboardId);
-		} catch (Exception err) {
-			log.error("[sendVarsByWhiteboardId]", err);
-			return -1;
-		}
-	}
-
-	private static Point getSize(FileItem fi) {
-		Point result = new Point(0, 0);
-		if (fi.getWidth() != null && fi.getHeight() != null) {
-			result.x = fi.getWidth();
-			result.y = fi.getHeight();
-		}
-		return result;
-	}
-
-	private static List<?> getWbObject(FileItem fi, String url) {
-		Point size = getSize(fi);
-		String type = "n/a";
-		switch (fi.getType()) {
-			case Image:
-				type = "image";
-				break;
-			case Presentation:
-				type = "swf";
-				break;
-			default:
-		}
-		return Arrays.asList(
-				type // 0
-				, url // urlname
-				, "--dummy--" // baseurl
-				, fi.getName() // fileName //3
-				, "--dummy--" // moduleName //4
-				, "--dummy--" // parentPath //5
-				, "--dummy--" // room //6
-				, "--dummy--" // domain //7
-				, 1 // slideNumber //8
-				, 0 // innerx //9
-				, 0 // innery //10
-				, size.x // innerwidth //11
-				, size.y // innerheight //12
-				, 20 // zoomlevel //13
-				, size.x // initwidth //14
-				, size.y // initheight //15
-				, 100 // currentzoom //16 FIXME TODO
-				, fi.getHash() // uniquObjectSyncName //17
-				, fi.getName() // standardFileName //18
-				, true // fullFit //19 FIXME TODO
-				, 0 // zIndex //-8
-				, null //-7
-				, 0 // this.counter //-6 FIXME TODO
-				, 0 // posx //-5
-				, 0 // posy //-4
-				, size.x // width //-3
-				, size.y // height //-2
-				, fi.getHash() // this.currentlayer.name //-1
-				);
-	}
-
-	private static List<?> getMp4WbObject(FileItem fi, String url) {
-		Point size = getSize(fi);
-		return Arrays.asList(
-				"flv" // 0: 'flv'
-				, fi.getId() // 1: 7
-				, fi.getName() // 2: 'BigBuckBunny_512kb.mp4'
-				, url // 3: posterUrl
-				, size.x // 4: 416
-				, size.y // 5: 240
-				, 0 // 6: 1 // z-index
-				, fi.getHash() // 7: null //TODO
-				, 0 // 8: 0 //TODO // counter
-				, 0 // 9: 0 //TODO // x
-				, 0 // 10: 0 //TODO // y
-				, size.x // 11: 749 // width
-				, size.y // 12: 739 // height
-				, fi.getHash() // 13: 'flv_1469602000351'
-				);
-	}
-
-	private static void copyFileToRoom(Long roomId, FileItem f) {
-		try {
-			if (roomId != null && f != null) {
-				File mp4 = f.getFile(EXTENSION_MP4);
-
-				File targetFolder = OmFileHelper.getStreamsSubDir(roomId);
-
-				File target = new File(targetFolder, mp4.getName());
-				if (mp4.exists() && !target.exists()) {
-					FileUtils.copyFile(mp4, target, false);
-				}
-			}
-		} catch (Exception err) {
-			log.error("[copyFileToCurrentRoom] ", err);
-		}
-	}
-
-	public void sendToWhiteboard(String uid, Long wbId, FileItem fi, String url, boolean clean) {
-		ClientSessionInfo csi = sessionManager.getClientByPublicSIDAnyServer(uid);
-		if (csi == null) {
-			log.warn("No client was found to send Wml:: {}", uid);
-			return;
-		}
-		Client client = csi.getRcl();
-
-		List<?> wbObject = new ArrayList<>();
-		switch (fi.getType()) {
-			case Image:
-				wbObject = getWbObject(fi, url);
-				break;
-			case Presentation:
-				wbObject = getWbObject(fi, url);
-				break;
-			case Video:
-			case Recording:
-				wbObject = getMp4WbObject(fi, url);
-				copyFileToRoom(client.getRoomId(), fi);
-				break;
-			default:
-		}
-		if (clean) {
-			Map<String, Object> wbClear = new HashMap<>();
-			wbClear.put("id", wbId);
-			wbClear.put("param", Arrays.asList("whiteboard", new Date(), "clear", null));
-
-			whiteboardCache.clear(client.getRoomId(), wbId);
-			sendToScope(client.getRoomId(), "sendVarsToWhiteboardById", Arrays.asList(null, wbClear));
-		}
-		sendToWhiteboard(client, Arrays.asList("whiteboard", new Date(), "draw", wbObject), wbId);
-	}
-
-	private int sendToWhiteboard(Client client, List<?> wbObj, Long wbId) {
-		try {
-			// Check if this User is the Mod:
-			if (client == null) {
-				return -1;
-			}
-
-			Map<Integer, Object> whiteboardObj = new HashMap<>();
-			int i = 0;
-			for (Object obj : wbObj) {
-				whiteboardObj.put(i++, obj);
-			}
-
-			Long roomId = client.getRoomId();
-
-			// log.debug("***** sendVars: " + whiteboardObj);
-
-			// Store event in list
-			String action = whiteboardObj.get(2).toString();
-
-			if (action.equals("deleteMindMapNodes")) {
-				// Simulate Single Delete Events for z-Index
-				List<?> actionObject = (List<?>) whiteboardObj.get(3);
-
-				@SuppressWarnings("unchecked")
-				List<List<?>> itemObjects = (List<List<?>>) actionObject.get(3);
-
-				Map<Integer, Object> whiteboardTempObj = new HashMap<>();
-				whiteboardTempObj.put(2, "delete");
-
-				for (List<?> itemObject : itemObjects) {
-					List<Object> tempActionObject = new ArrayList<>();
-					tempActionObject.add("mindmapnode");
-					tempActionObject.add(itemObject.get(0)); // z-Index -8
-					tempActionObject.add(null); // simulate -7
-					tempActionObject.add(null); // simulate -6
-					tempActionObject.add(null); // simulate -5
-					tempActionObject.add(null); // simulate -4
-					tempActionObject.add(null); // simulate -3
-					tempActionObject.add(null); // simulate -2
-					tempActionObject.add(itemObject.get(1)); // Object-Name -1
-
-					whiteboardTempObj.put(3, tempActionObject);
-
-					whiteboardManager.add(roomId, whiteboardTempObj, wbId);
-				}
-			} else {
-				whiteboardManager.add(roomId, whiteboardObj, wbId);
-			}
-
-			Map<String, Object> sendObject = new HashMap<>();
-			sendObject.put("id", wbId);
-			sendObject.put("param", wbObj);
-
-			boolean showDrawStatus = getWhiteboardDrawStatus();
-
-			sendToScope(roomId, "sendVarsToWhiteboardById", new Object[] { showDrawStatus ? client : null, sendObject });
-		} catch (Exception err) {
-			log.error("[sendToWhiteboard]", err);
-			return -1;
-		}
-		return 1;
-	}
-
 	public int sendMessage(Object newMessage) {
 		sendMessageToCurrentScope("sendVarsToMessage", newMessage, false);
 		return 1;
@@ -1867,10 +1653,6 @@ public class ScopeApplicationAdapter ext
 		return new ArrayList<>();
 	}
 
-	private boolean getWhiteboardDrawStatus() {
-		return cfgDao.getWhiteboardDrawStatus();
-	}
-
 	public String getCryptKey() {
 		return cfgDao.getCryptKey();
 	}

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java Wed Apr 12 17:17:42 2017
@@ -100,7 +100,7 @@ public class ApplicationHelper {
 				OMContextListener omcl = new OMContextListener();
 				omcl.contextInitialized(new ServletContextEvent(sc));
 				XmlWebApplicationContext xmlContext = new XmlWebApplicationContext();
-				xmlContext.setConfigLocation("classpath:openmeetings-applicationContext.xml");
+				xmlContext.setConfigLocation("classpath:applicationContext.xml");
 				xmlContext.setServletContext(sc);
 				xmlContext.refresh();
 				sc.setAttribute(ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, xmlContext);

Modified: openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as (original)
+++ openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as Wed Apr 12 17:17:42 2017
@@ -160,18 +160,9 @@ public class OmVideo {
 		}
 	}
 
-	private function getUrl():String {
-		var secure:Boolean = ('true' === params.secure);
-		var url:String = (secure ? "rtmps" : "rtmp") + "://"
-				+ params.host + ":" + (secure ? params.rtmpsPort : params.rtmpPort)
-				+ "/" + params.app;
-		//TODO fallback
-		return url;
-	}
-
 	private function publish(mode:String, name:String, cam:Camera, mic:Microphone, f:Function):void {
 		if (nc == null || !nc.connected) {
-			var url:String = getUrl();
+			var url:String = params.url;  //TODO fallback
 			debug("NetConnection is not connected", url);
 			nc = new NetConnection();
 			nc.addEventListener(NetStatusEvent.NET_STATUS, function onConnectionStatus(e:NetStatusEvent):void {

Modified: openmeetings/application/trunk/openmeetings-server/src/site/xdoc/Clustering.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-server/src/site/xdoc/Clustering.xml?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-server/src/site/xdoc/Clustering.xml (original)
+++ openmeetings/application/trunk/openmeetings-server/src/site/xdoc/Clustering.xml Wed Apr 12 17:17:42 2017
@@ -80,7 +80,7 @@
 			</ul> 
 		</section>
 		<section name="OM nodes configuration">
-			<p>In the file <tt>/opt/red5/webapps/openmeetings/WEB-INF/classes/openmeetings-applicationContext.xml</tt>:</p>
+			<p>In the file <tt>/opt/red5/webapps/openmeetings/WEB-INF/classes/applicationContext.xml</tt>:</p>
 			<ul>
 				<li>
 					For each node uncomment line:

Modified: openmeetings/application/trunk/openmeetings-server/src/site/xdoc/voip-sip-integration.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-server/src/site/xdoc/voip-sip-integration.xml?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-server/src/site/xdoc/voip-sip-integration.xml (original)
+++ openmeetings/application/trunk/openmeetings-server/src/site/xdoc/voip-sip-integration.xml Wed Apr 12 17:17:42 2017
@@ -61,9 +61,12 @@
                 <a href="red5sip-integration_3.1.html">
                 Instruction how-to set up OpenMeetings SIP-Transport integration for Openmeetings 3.1+
                 </a>.<br/>
+				<a href="red5sip-integration_4.0.html">
+				Instruction how-to set up OpenMeetings SIP-Transport integration for Openmeetings 4.0+
+				</a>.<br/>
 			</p>
 		</section>
 
 	</body>
 
-</document>
\ No newline at end of file
+</document>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Wed Apr 12 17:17:42 2017
@@ -99,8 +99,7 @@ import org.apache.wicket.request.cycle.R
 import org.apache.wicket.request.mapper.info.PageComponentInfo;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
-import org.apache.wicket.request.resource.JavaScriptResourceReference;
-import org.apache.wicket.resource.DynamicJQueryResourceReference;
+import org.apache.wicket.resource.JQueryResourceReference;
 import org.apache.wicket.util.collections.ConcurrentHashSet;
 import org.apache.wicket.validation.validator.UrlValidator;
 import org.slf4j.Logger;
@@ -138,8 +137,7 @@ public class Application extends Authent
 		//chain of Resource Loaders, if not found it will search in Wicket's internal
 		//Resource Loader for a the property key
 		getResourceSettings().getStringResourceLoaders().add(0, new LabelResourceLoader());
-		//FIXME TODO v3 on the way
-		getJavaScriptLibrarySettings().setJQueryReference(new JavaScriptResourceReference(DynamicJQueryResourceReference.class, DynamicJQueryResourceReference.VERSION_2));
+		getJavaScriptLibrarySettings().setJQueryReference(JQueryResourceReference.getV3());
 
 		super.init();
 

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java Wed Apr 12 17:17:42 2017
@@ -34,16 +34,20 @@ import org.apache.openmeetings.db.entity
 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.common.OmAjaxClientInfoBehavior;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.SwfPanel;
+import org.apache.openmeetings.web.room.VideoSettings;
 import org.apache.openmeetings.web.user.record.VideoInfo;
 import org.apache.openmeetings.web.user.record.VideoPlayer;
+import org.apache.openmeetings.web.util.ExtendedClientProperties;
 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.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.EmptyPanel;
+import org.apache.wicket.protocol.http.request.WebClientInfo;
 import org.apache.wicket.request.IRequestParameters;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.StringValue;
@@ -137,9 +141,25 @@ public class HashPage extends BaseInited
 			}
 		}
 		StringValue swf = p.get(SWF);
-		if (!swf.isEmpty() && (SWF_TYPE_NETWORK.equals(swf.toString()) || SWF_TYPE_SETTINGS.equals(swf.toString()))) {
-			replace(new SwfPanel(PANEL_MAIN, p));
-			error = false;
+		if (!swf.isEmpty()) {
+			if (SWF_TYPE_NETWORK.equals(swf.toString())) {
+				replace(new SwfPanel(PANEL_MAIN, p));
+				error = false;
+			}
+			if (SWF_TYPE_SETTINGS.equals(swf.toString())) {
+				replace(new VideoSettings(PANEL_MAIN).add(new OmAjaxClientInfoBehavior() {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onClientInfo(AjaxRequestTarget target, WebClientInfo info) {
+						super.onClientInfo(target, info);
+						target.appendJavaScript(
+								VideoSettings.getInitScript((ExtendedClientProperties)info.getProperties(), "hibernate", "networktest")
+								.append("VideoSettings.open();"));
+					}
+				}));
+				error = false;
+			}
 		}
 		add(recContainer.add(vi.setShowShare(false).setOutputMarkupPlaceholderTag(true),
 				vp.setOutputMarkupPlaceholderTag(true)), new InvitationPasswordDialog("i-pass", this));

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Wed Apr 12 17:17:42 2017
@@ -27,8 +27,6 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Map.Entry;
@@ -36,7 +34,6 @@ import java.util.Set;
 import java.util.UUID;
 
 import org.apache.directory.api.util.Strings;
-import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
 import org.apache.openmeetings.db.dao.log.ConferenceLogDao;
@@ -65,6 +62,7 @@ import org.apache.openmeetings.web.room.
 import org.apache.openmeetings.web.room.menu.RoomMenuPanel;
 import org.apache.openmeetings.web.room.sidebar.RoomSidebar;
 import org.apache.openmeetings.web.room.wb.WbPanel;
+import org.apache.openmeetings.web.util.ExtendedClientProperties;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
@@ -77,14 +75,12 @@ import org.apache.wicket.markup.head.Jav
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.protocol.http.ClientProperties;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
-import com.github.openjson.JSONObject;
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable;
@@ -113,30 +109,13 @@ public class RoomPanel extends BasePanel
 		@Override
 		protected void respond(AjaxRequestTarget target) {
 			target.appendJavaScript("setRoomSizes();");
+			ExtendedClientProperties cp = WebSession.get().getExtendedProperties();
 			getBean(ConferenceLogDao.class).add(
 					ConferenceLog.Type.roomEnter
 					, getUserId(), "0", r.getId()
-					, WebSession.get().getClientInfo().getProperties().getRemoteAddress()
+					, cp.getRemoteAddress()
 					, "" + r.getId());
-			//TODO SID etc
-			try {
-				URL url = new URL(WebSession.get().getExtendedProperties().getCodebase());
-				String path = url.getPath();
-				path = path.substring(1, path.indexOf('/', 2) + 1);
-				ClientProperties cp = WebSession.get().getClientInfo().getProperties();
-				target.appendJavaScript(String.format("VideoSettings.init(%s);", new JSONObject(getBean(ScopeApplicationAdapter.class).getFlashSettings().toString())
-						.put("uid", getClient().getUid())
-						.put("audioOnly", r.isAudioOnly())
-						.put("SID", WebSession.getSid())
-						.put("interview", Room.Type.interview == r.getType())
-						.put("host", url.getHost())
-						.put("app", path + r.getId())
-						.put("wmode", cp.isBrowserInternetExplorer() && cp.getBrowserVersionMajor() == 11 ? "opaque" : "direct")
-						.toString()
-						));
-			} catch (NullPointerException|MalformedURLException e) {
-				log.error("Error while constructing room parameters", e);
-			}
+			target.appendJavaScript(VideoSettings.getInitScript(cp, "" + r.getId(), getClient().getUid()));
 			WebSocketHelper.sendRoom(new RoomMessage(r.getId(), getUserId(), RoomMessage.Type.roomEnter));
 			getMainPanel().getChat().roomEnter(r, target);
 			if (r.isFilesOpened()) {
@@ -616,10 +595,9 @@ public class RoomPanel extends BasePanel
 
 	public boolean screenShareAllowed() {
 		Room r = getRoom();
-		org.apache.openmeetings.db.entity.room.Client rcl = RoomBroadcaster.getClient(getMainPanel().getClient().getUid());
 		return Room.Type.interview != r.getType() && !r.isHidden(RoomElement.ScreenSharing)
 				&& r.isAllowRecording() && getClient().hasRight(Right.share)
-				&& getSharingUser() == null && rcl != null && rcl.getUserId() != null;
+				&& getSharingUser() == null;
 	}
 
 	public RoomSidebar getSidebar() {

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html?rev=1791161&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html Wed Apr 12 17:17:42 2017
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+      http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<div id="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 right">
+					<div><button class="rec-start"><wicket:message key="775"/></button></div>
+				</div>
+			</div>
+			<div class="vid-block">
+				<div class="video-conainer"></div>
+				<div class="level-meter"></div>
+				<div class="sett-row right">
+					<div><button class="play"><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>

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java?rev=1791161&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java Wed Apr 12 17:17:42 2017
@@ -0,0 +1,95 @@
+/*
+ * 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.room;
+
+import static org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_FPS;
+import static org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_NATIVE_SSL;
+import static org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_PORT;
+import static org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_SECURE;
+import static org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_SSL_PORT;
+import static org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.FLASH_VIDEO_CODEC;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.net.URL;
+
+import org.apache.directory.api.util.Strings;
+import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.openmeetings.web.util.ExtendedClientProperties;
+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.panel.Panel;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+
+import com.github.openjson.JSONObject;
+
+public class VideoSettings extends Panel {
+	private final static long serialVersionUID = 1L;
+	private final static Logger log = Red5LoggerFactory.getLogger(VideoSettings.class, webAppRootKey);
+	private final static ResourceReference SETTINGS_JS_REFERENCE = new JavaScriptResourceReference(VideoSettings.class, "settings.js");
+	private final static String URL = "url";
+	private final static String FALLBACK = "fallback";
+
+	public VideoSettings(String id) {
+		super(id);
+	}
+
+	@Override
+	public void renderHead(IHeaderResponse response) {
+		super.renderHead(response);
+		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(SETTINGS_JS_REFERENCE)));
+	}
+
+	private static String getUri(String protocol, String host, Object port, String app) {
+		return String.format("%s://%s:%s/%s", protocol, host, port, app);
+	}
+
+	public static StringBuilder getInitScript(ExtendedClientProperties cp, String scope, String uid) {
+		JSONObject gs = getBean(ScopeApplicationAdapter.class).getFlashSettings();
+		JSONObject s = new JSONObject()
+				.put(FLASH_VIDEO_CODEC, gs.get(FLASH_VIDEO_CODEC))
+				.put(FLASH_FPS, gs.get(FLASH_FPS))
+				.put("SID", WebSession.getSid())
+				.put("wmode", cp.isBrowserInternetExplorer() && cp.getBrowserVersionMajor() == 11 ? "opaque" : "direct");
+		if (!Strings.isEmpty(uid)) {
+			s.put("uid", uid);
+		}
+		try {
+			URL url = new URL(cp.getCodebase());
+			String path = url.getPath();
+			path = path.substring(1, path.indexOf('/', 2) + 1) + scope;
+			if (gs.getBoolean(FLASH_SECURE)) {
+				s.put(FLASH_NATIVE_SSL, gs.get(FLASH_NATIVE_SSL));
+				s.put(URL, getUri("rtmps", url.getHost(), gs.getString(FLASH_SSL_PORT), path));
+				s.put(FALLBACK, getUri("rtmps", url.getHost(), url.getPort(), path));
+			} else {
+				s.put(URL, getUri("rtmp", url.getHost(), gs.getString(FLASH_PORT), path));
+				s.put(FALLBACK, getUri("rtmpt", url.getHost(), url.getPort(), path));
+			}
+		} catch (Exception e) {
+			log.error("Error while constructing video settings parameters", e);
+		}
+		return new StringBuilder("VideoSettings.init(").append(s.toString()).append(");");
+	}
+}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js Wed Apr 12 17:17:42 2017
@@ -16,19 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-function initVideo(el, id, options) {
-	var type = 'application/x-shockwave-flash';
-	var src = 'public/main.swf?cache' + new Date().getTime();
-	var o = $('<object>').attr('id', id).attr('type', type).attr('data', src).attr('width', options.width).attr('height', options.height);
-	o.append($('<param>').attr('name', 'quality').attr('value', 'best'))
-		.append($('<param>').attr('name', 'wmode').attr('value', options.wmode))
-		.append($('<param>').attr('name', 'allowscriptaccess').attr('value', 'sameDomain'))
-		.append($('<param>').attr('name', 'allowfullscreen').attr('value', 'false'))
-		.append($('<param>').attr('name', 'flashvars').attr('value', $.param(options)));
-	el.append(o);
-	return o;
-}
-
 function setRoomSizes() {
 	var sb = $(".room.sidebar.left")
 		, w = $(window).width() - sb.width() - 5
@@ -92,156 +79,6 @@ function startPrivateChat(el) {
 	Chat.open();
 	$('#chatMessage .wysiwyg-editor').click();
 }
-var VideoSettings = (function() {
-	var self = {}, vs, lm, swf, s, cam, mic, res,
-		vidScroll, recBtn, playBtn, inited = false, recAllowed = false;
-	function _load() {
-		s = {};
-		try {
-			s = JSON.parse(localStorage.getItem('openmeetings')) || s;
-		} catch (e) {}
-		if (!s.video) {
-			s.video = {};
-		}
-	}
-	function _save() {
-		localStorage.setItem('openmeetings', JSON.stringify(s));
-	}
-	function _init(options) {
-		vs = $('#video-settings');
-		lm = vs.find('.level-meter');
-		cam = vs.find('select.cam');
-		mic = vs.find('select.mic');
-		res = vs.find('select.cam-resolution');
-		vidScroll = vs.find('.vid-block .video-conainer');
-		recBtn = vs.find('.rec-start').click(function() {
-			recBtn.prop('disabled', true).button('refresh'); //TODO disable drop-downs
-			swf.startRec();
-		});
-		playBtn = vs.find('.play').click(function() {
-			swf.play();
-		});
-		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() {
-						_save();
-						vs.dialog("close");
-					}
-				}
-				, {
-					text: vs.data('btn-cancel')
-					, click: function() {
-						vs.dialog("close");
-					}
-				}
-			]
-		});
-		lm.progressbar({ value: 0 });
-		options.width = 300;
-		options.height = 200;
-		swf = initVideo(vidScroll, 'video-settings-swf', options)[0];
-		vs.find('input, button').prop('disabled', true);
-		vs.find('button').button();
-		var rr = vs.find('.cam-resolution').parent('.sett-row');
-		if (!!options.interview) {
-			rr.show();
-		} else {
-			rr.hide();
-		}
-		_load();
-	}
-	function _updateRec() {
-		recBtn.prop('disabled', !recAllowed && (s.video.cam > -1 || s.video.mic > -1)).button('refresh');
-	}
-	function _readValues() {
-		s.video.cam = 1 * cam.val();
-		s.video.mic = 1 * mic.val();
-		var o = res.find('option:selected').data();
-		s.video.width = o.width;
-		s.video.height = o.height;
-		$(swf).attr('width', Math.max(300, s.video.width)).attr('height', Math.max(200, s.video.height));
-		vidScroll.scrollLeft(Math.max(0, s.video.width / 2 - 150))
-			.scrollTop(Math.max(0, s.video.height / 2 - 110));
-		_updateRec();
-	}
-	
-	function _allowRec(allow) {
-		recAllowed = allow;
-		_updateRec();
-	}
-	function _allowPlay() {
-		_updateRec();
-		playBtn.prop('disabled', false).button('refresh');
-	}
-	function _micActivity(level) {
-		console.log("activity: ", level)
-		lm.progressbar("value", Math.max(0, level));
-	}
-	function _initSwf() {
-		if (!inited) {
-			var obj = swf.getDevices();
-			for (var i = 0; i < obj.cams.length; ++i) {
-				var o = $('<option></option>').attr('value', i).text(obj.cams[i]);
-				if (i == s.video.cam) {
-					o.prop('selected', true);
-				}
-				cam.append(o);
-			}
-			cam.prop('disabled', false).change(function() {
-				_readValues();
-				swf.camChanged(s.video.cam);
-			});
-			for (var i = 0; i < obj.mics.length; ++i) {
-				var o = $('<option></option>').attr('value', i).text(obj.mics[i]);
-				if (i == s.video.mic) {
-					o.prop('selected', true);
-				}
-				mic.append(o);
-			}
-			mic.prop('disabled', false).change(function() {
-				_readValues();
-				swf.micChanged(s.video.mic);
-			});
-			res.change(function() {
-				_readValues();
-				swf.resChanged(s.video.width, s.video.height);
-			});
-			res.find('option').each(function(idx) {
-				var o = $(this).data();
-				if (o.width == s.video.width && o.height == s.video.height) {
-					$(this).prop('selected', true);
-					return false;
-				}
-			});
-		}
-		_readValues();
-		swf.init(s.video.cam, s.video.mic, s.video.width, s.video.height);
-	}
-	function _open() {
-		recAllowed = false;
-		vs.dialog('open');
-	}
-	return {
-		init: _init
-		, initSwf: _initSwf
-		, open: _open
-		, allowRec: _allowRec
-		, allowPlay: _allowPlay
-		, micActivity: _micActivity
-		, close: function() { vs.dialog('close'); }
-	};
-})();
-
 /***** functions required by SIP   ******/
 function sipBtnClick() {
 	var txt = $('.sip-number');

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js?rev=1791161&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js Wed Apr 12 17:17:42 2017
@@ -0,0 +1,179 @@
+/**
+ * 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.
+ */
+function initVideo(el, id, options) {
+	var type = 'application/x-shockwave-flash';
+	var src = 'public/main.swf?cache' + new Date().getTime();
+	var o = $('<object>').attr('id', id).attr('type', type).attr('data', src).attr('width', options.width).attr('height', options.height);
+	o.append($('<param>').attr('name', 'quality').attr('value', 'best'))
+		.append($('<param>').attr('name', 'wmode').attr('value', options.wmode))
+		.append($('<param>').attr('name', 'allowscriptaccess').attr('value', 'sameDomain'))
+		.append($('<param>').attr('name', 'allowfullscreen').attr('value', 'false'))
+		.append($('<param>').attr('name', 'flashvars').attr('value', $.param(options)));
+	el.append(o);
+	return o;
+}
+var VideoSettings = (function() {
+	var self = {}, vs, lm, swf, s, cam, mic, res,
+		vidScroll, recBtn, playBtn, inited = false, recAllowed = false;
+	function _load() {
+		s = {};
+		try {
+			s = JSON.parse(localStorage.getItem('openmeetings')) || s;
+		} catch (e) {}
+		if (!s.video) {
+			s.video = {};
+		}
+	}
+	function _save() {
+		localStorage.setItem('openmeetings', JSON.stringify(s));
+	}
+	function _init(options) {
+		vs = $('#video-settings');
+		lm = vs.find('.level-meter');
+		cam = vs.find('select.cam');
+		mic = vs.find('select.mic');
+		res = vs.find('select.cam-resolution');
+		vidScroll = vs.find('.vid-block .video-conainer');
+		recBtn = vs.find('.rec-start').click(function() {
+			recBtn.prop('disabled', true).button('refresh'); //TODO disable drop-downs
+			swf.startRec();
+		});
+		playBtn = vs.find('.play').click(function() {
+			swf.play();
+		});
+		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() {
+						_save();
+						vs.dialog("close");
+					}
+				}
+				, {
+					text: vs.data('btn-cancel')
+					, click: function() {
+						vs.dialog("close");
+					}
+				}
+			]
+		});
+		lm.progressbar({ value: 0 });
+		options.width = 300;
+		options.height = 200;
+		swf = initVideo(vidScroll, 'video-settings-swf', options)[0];
+		vs.find('input, button').prop('disabled', true);
+		vs.find('button').button();
+		var rr = vs.find('.cam-resolution').parent('.sett-row');
+		if (!!options.interview) {
+			rr.show();
+		} else {
+			rr.hide();
+		}
+		_load();
+	}
+	function _updateRec() {
+		recBtn.prop('disabled', !recAllowed && (s.video.cam > -1 || s.video.mic > -1)).button('refresh');
+	}
+	function _readValues() {
+		s.video.cam = 1 * cam.val();
+		s.video.mic = 1 * mic.val();
+		var o = res.find('option:selected').data();
+		s.video.width = o.width;
+		s.video.height = o.height;
+		$(swf).attr('width', Math.max(300, s.video.width)).attr('height', Math.max(200, s.video.height));
+		vidScroll.scrollLeft(Math.max(0, s.video.width / 2 - 150))
+			.scrollTop(Math.max(0, s.video.height / 2 - 110));
+		_updateRec();
+	}
+	
+	function _allowRec(allow) {
+		recAllowed = allow;
+		_updateRec();
+	}
+	function _allowPlay() {
+		_updateRec();
+		playBtn.prop('disabled', false).button('refresh');
+	}
+	function _micActivity(level) {
+		console.log("activity: ", level)
+		lm.progressbar("value", Math.max(0, level));
+	}
+	function _initSwf() {
+		if (!inited) {
+			var obj = swf.getDevices();
+			for (var i = 0; i < obj.cams.length; ++i) {
+				var o = $('<option></option>').attr('value', i).text(obj.cams[i]);
+				if (i == s.video.cam) {
+					o.prop('selected', true);
+				}
+				cam.append(o);
+			}
+			cam.prop('disabled', false).change(function() {
+				_readValues();
+				swf.camChanged(s.video.cam);
+			});
+			for (var i = 0; i < obj.mics.length; ++i) {
+				var o = $('<option></option>').attr('value', i).text(obj.mics[i]);
+				if (i == s.video.mic) {
+					o.prop('selected', true);
+				}
+				mic.append(o);
+			}
+			mic.prop('disabled', false).change(function() {
+				_readValues();
+				swf.micChanged(s.video.mic);
+			});
+			res.change(function() {
+				_readValues();
+				swf.resChanged(s.video.width, s.video.height);
+			});
+			res.find('option').each(function(idx) {
+				var o = $(this).data();
+				if (o.width == s.video.width && o.height == s.video.height) {
+					$(this).prop('selected', true);
+					return false;
+				}
+			});
+		}
+		_readValues();
+		swf.init(s.video.cam, s.video.mic, s.video.width, s.video.height);
+	}
+	function _open() {
+		recAllowed = false;
+		vs.dialog('open');
+	}
+	return {
+		init: _init
+		, initSwf: _initSwf
+		, open: _open
+		, allowRec: _allowRec
+		, allowPlay: _allowPlay
+		, micActivity: _micActivity
+		, close: function() { vs.dialog('close'); }
+	};
+})();

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html Wed Apr 12 17:17:42 2017
@@ -40,71 +40,6 @@
 	<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 right">
-					<div><button class="rec-start"><wicket:message key="775"/></button></div>
-				</div>
-			</div>
-			<div class="vid-block">
-				<div class="video-conainer"></div>
-				<div class="level-meter"></div>
-				<div class="sett-row right">
-					<div><button class="play"><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>
+	<div wicket:id="settings" />
 </wicket:panel>
 </html>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Wed Apr 12 17:17:42 2017
@@ -34,12 +34,13 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.web.app.Application;
-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.room.RoomBroadcaster;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.RoomPanel.Action;
+import org.apache.openmeetings.web.room.VideoSettings;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -89,6 +90,7 @@ public class RoomSidebar extends Panel {
 	private boolean avInited = false;
 	private int selectedIdx = 0;
 	private Client kickedClient;
+	private VideoSettings settings = new VideoSettings("settings");
 	private final ListView<Client> users = new ListView<Client>("user", new ArrayList<Client>()) {
 		private static final long serialVersionUID = 1L;
 
@@ -314,7 +316,7 @@ public class RoomSidebar extends Panel {
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
-		add(addFolder);
+		add(addFolder, settings);
 		add(toggleRight, toggleActivity, roomAction, avSettings);
 		add(confirmKick = new ConfirmableAjaxBorder("confirm-kick", getString("603"), getString("605")) {
 			private static final long serialVersionUID = 1L;

Copied: openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml (from r1791160, openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml)
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml?p2=openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml&p1=openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml&r1=1791160&r2=1791161&rev=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml Wed Apr 12 17:17:42 2017
@@ -204,7 +204,6 @@
 	<bean id="importInitvalues" class="org.apache.openmeetings.installation.ImportInitvalues" />
 	<bean id="ldapLoginManagement" class="org.apache.openmeetings.core.ldap.LdapLoginManagement" />
 	<bean id="timezoneUtil" class="org.apache.openmeetings.db.util.TimezoneUtil" />
-	<bean id="whiteboardManager" class="org.apache.openmeetings.core.data.whiteboard.WhiteboardManager" />
 	<bean id="backupExport" class="org.apache.openmeetings.backup.BackupExport" />
 	<bean id="backupImport" class="org.apache.openmeetings.backup.BackupImport" />
 	<bean id="appointmentManager" class="org.apache.openmeetings.service.calendar.caldav.AppointmentManager" destroy-method="destroy"/>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/red5-web.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/red5-web.xml?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/red5-web.xml (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/red5-web.xml Wed Apr 12 17:17:42 2017
@@ -37,5 +37,5 @@
 		<property name="virtualHosts" value="${webapp.virtualHosts}" />
 	</bean>
 
-	<import resource="classes/openmeetings-applicationContext.xml" />
+	<import resource="classes/applicationContext.xml" />
 </beans>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/web.xml?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/web.xml (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/web.xml Wed Apr 12 17:17:42 2017
@@ -35,7 +35,7 @@
 		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
 		<init-param>
 			<param-name>config-location</param-name>
-			<param-value>classpath:openmeetings-applicationContext.xml</param-value>
+			<param-value>classpath:applicationContext.xml</param-value>
 		</init-param>
 		<load-on-startup>1</load-on-startup>
 		<async-supported>true</async-supported>

Modified: openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractSpringTest.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractSpringTest.java?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractSpringTest.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractSpringTest.java Wed Apr 12 17:17:42 2017
@@ -32,7 +32,7 @@ import org.springframework.test.context.
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @TestExecutionListeners({})
-@ContextConfiguration(locations={"classpath:openmeetings-applicationContext.xml"}, inheritLocations = true)
+@ContextConfiguration(locations={"classpath:applicationContext.xml"}, inheritLocations = true)
 public abstract class AbstractSpringTest extends AbstractJUnit4SpringContextTests {
 
 	@BeforeClass

Modified: openmeetings/application/trunk/pom.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/pom.xml?rev=1791161&r1=1791160&r2=1791161&view=diff
==============================================================================
--- openmeetings/application/trunk/pom.xml (original)
+++ openmeetings/application/trunk/pom.xml Wed Apr 12 17:17:42 2017
@@ -40,7 +40,7 @@
 		<maven.javadoc.version>2.10.3</maven.javadoc.version>
 		<maven.surefire.version>2.19.1</maven.surefire.version>
 		<maven-site.version>3.3</maven-site.version>
-		<wicket.version>8.0.0-M5</wicket.version>
+		<wicket.version>8.0.0-SNAPSHOT</wicket.version>
 		<wicketju.version>8.0.0-M5</wicketju.version>
 		<wickets.version>8.0.0-M5</wickets.version>
 		<red5-server.version>1.0.9-M6</red5-server.version>