[OPENMEETINGS-551] hash?swf=settings is fixed, code clean-up

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

Branch: refs/heads/master
Commit: b1c600933eeb725440d5e30f73afb5f7bd5aa14d
Parents: b27ea43
Author: Maxim Solodovnik <[email protected]>
Authored: Wed Apr 12 17:17:42 2017 +0000
Committer: Maxim Solodovnik <[email protected]>
Committed: Wed Apr 12 17:17:42 2017 +0000

----------------------------------------------------------------------
 .../core/data/whiteboard/WhiteboardManager.java | 135 ----------
 .../core/remote/ConferenceLibrary.java          |  63 -----
 .../openmeetings/core/remote/MainService.java   | 165 ------------
 .../remote/red5/ScopeApplicationAdapter.java    | 242 +----------------
 .../openmeetings/db/util/ApplicationHelper.java |   2 +-
 .../flex/org/apache/openmeetings/OmVideo.as     |  11 +-
 .../src/site/xdoc/Clustering.xml                |   2 +-
 .../src/site/xdoc/voip-sip-integration.xml      |   5 +-
 .../openmeetings/web/app/Application.java       |   6 +-
 .../apache/openmeetings/web/pages/HashPage.java |  26 +-
 .../apache/openmeetings/web/room/RoomPanel.java |  32 +--
 .../openmeetings/web/room/VideoSettings.html    |  90 +++++++
 .../openmeetings/web/room/VideoSettings.java    |  95 +++++++
 .../org/apache/openmeetings/web/room/room.js    | 163 ------------
 .../apache/openmeetings/web/room/settings.js    | 179 +++++++++++++
 .../web/room/sidebar/RoomSidebar.html           |  67 +----
 .../web/room/sidebar/RoomSidebar.java           |   6 +-
 .../WEB-INF/classes/applicationContext.xml      | 260 ++++++++++++++++++
 .../classes/openmeetings-applicationContext.xml | 261 -------------------
 .../src/main/webapp/WEB-INF/red5-web.xml        |   2 +-
 .../src/main/webapp/WEB-INF/web.xml             |   2 +-
 .../openmeetings/test/AbstractSpringTest.java   |   2 +-
 pom.xml                                         |   2 +-
 23 files changed, 682 insertions(+), 1136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
deleted file mode 100644
index 2154b96..0000000
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * 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.core.data.whiteboard;
-
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-
-import java.util.Map;
-
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public class WhiteboardManager {
-       private static final Logger log = 
Red5LoggerFactory.getLogger(WhiteboardManager.class, webAppRootKey);
-
-       @Autowired
-       private WhiteboardCache whitebardCache;
-
-       @SuppressWarnings("unchecked")
-       public void add(Long roomId, Map<Integer, Object> whiteboardObj, Long 
whiteBoardId) {
-               /* FIXME TODO check this
-               try {
-                       log.debug("add: ", whiteboardObj);
-
-                       String action = whiteboardObj.get(2).toString();
-
-                       log.debug("action: " + action);
-                       log.debug("actionObject: " + whiteboardObj.get(3));
-
-                       List<Object> actionObject = (List<Object>) 
whiteboardObj.get(3);
-
-                       Whiteboard wb = whitebardCache.get(roomId, 
whiteBoardId);
-                       if (action.equals("moveMap")) {
-                               
wb.setX(Integer.valueOf(actionObject.get(1).toString()));
-                               
wb.setY(Integer.valueOf(actionObject.get(2).toString()));
-                       } else if (action.equals("draw") || 
action.equals("redo")) {
-                               // log.debug(actionObject);
-                               // log.debug(actionObject.size()-1);
-                               // 
log.debug(actionObject.get(actionObject.size()-1));
-                               if (actionObject != null && 
!actionObject.isEmpty()) {
-                                       String objectType = 
actionObject.get(0).toString();
-                                       if 
(!objectType.equals("pointerWhiteBoard")) {
-                                               String objectOID = 
actionObject.get(actionObject.size() - 1).toString();
-                                               log.debug("objectOID: " + 
objectOID);
-                                               wb.add(objectOID, actionObject);
-                                       }
-                               }
-                       } else if (action.equals("clear")) {
-                               wb.clear();
-                       } else if (action.equals("delete") || 
action.equals("undo")) {
-                               wb.remove(actionObject);
-                       } else if (action.equals("size") || 
action.equals("editProp")
-                                       || action.equals("editTextMindMapNode")
-                                       || action.equals("editText") || 
action.equals("swf")
-                                       || action.equals("flv")
-                                       || action.equals("editTextMindMapColor")
-                                       || 
action.equals("editTextMindMapFontColor")) {
-                               String objectOID = 
actionObject.get(actionObject.size() - 1).toString();
-                               // List roomItem = roomList.get(objectOID);
-                               List<Object> currentObject = wb.get(objectOID);
-                               if ("paint".equals(actionObject.get(0))) {
-                                       actionObject.set(1, 
currentObject.get(1));
-                               }
-                               wb.add(objectOID, actionObject);
-
-                               if (action.equals("swf")) {
-                                       log.debug("actionObject " + 
actionObject);
-                                       if (actionObject.get(0).equals("swf")) {
-                                               if (actionObject.get(8) != 
currentObject.get(8)) {
-                                                       String baseObjectName = 
actionObject.get(actionObject.size() - 1).toString();
-                                                       Integer slidesNumber = 
Integer.valueOf(actionObject.get(8).toString());
-
-                                                       
log.debug("updateObjectsToSlideNumber :: " + baseObjectName + "," + 
slidesNumber);
-
-                                                       for (Entry<String, 
List<Object>> me : wb.entrySet()) {
-                                                               List<Object> 
actionObjectStored = me.getValue();
-
-                                                               if 
(actionObjectStored.get(0).equals("ellipse")
-                                                                               
|| actionObjectStored.get(0).equals("drawarrow")
-                                                                               
|| actionObjectStored.get(0).equals("line")
-                                                                               
|| actionObjectStored.get(0).equals("clipart")
-                                                                               
|| actionObjectStored.get(0).equals("paint")
-                                                                               
|| actionObjectStored.get(0).equals("rectangle")
-                                                                               
|| actionObjectStored.get(0).equals("uline")
-                                                                               
|| actionObjectStored.get(0).equals("image")
-                                                                               
|| actionObjectStored.get(0).equals("letter")) {
-
-                                                                       
Map<String, Object> swfObj = (Map<String, Object>) 
actionObjectStored.get(actionObjectStored.size() - 7);
-                                                                       
log.debug("swfObj :1: " + swfObj);
-
-                                                                       if 
(swfObj != null) {
-                                                                               
if (swfObj.get("name").equals(baseObjectName)) {
-                                                                               
        swfObj.put("isVisible", 
Integer.parseInt(swfObj.get("slide").toString()) == slidesNumber);
-                                                                               
        actionObjectStored.set(actionObjectStored.size() - 7, swfObj);
-                                                                               
}
-                                                                       }
-
-                                                                       
log.debug("swfObj :1: " + swfObj);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                       } else if (action.equals("clearSlide")) {
-                               for (Object objectName : actionObject) {
-                                       wb.remove(objectName);
-                               }
-                       } else if (action.equals("whiteboardObj")) {
-                               wb.setFullFit((Boolean) actionObject.get(1));
-                               wb.setZoom((Integer) actionObject.get(2));
-                       } else {
-                               log.warn("Unkown Type: " + action + " 
actionObject: " + actionObject);
-                       }
-               } catch (Exception err) {
-                       log.error("[add]", err);
-               }
-               */
-       }
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
index 58c6350..230cc89 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
@@ -21,24 +21,14 @@ package org.apache.openmeetings.core.remote;
 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 implements 
IPendingServiceCallback {
        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 implements 
IPendingServiceCallback {
        }
 
        /**
-        * 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
         *

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
index b16733d..74db960 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MainService.java
@@ -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 IPendingServiceCallback 
{
        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 IPendingServiceCallback 
{
                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);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
index 6a44556..ab9d5ab 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
@@ -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.server.SessiondataDao;
 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 extends 
MultiThreadedApplicationAdapter imp
        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 extends 
MultiThreadedApplicationAdapter imp
                                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 extends 
MultiThreadedApplicationAdapter imp
                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 extends 
MultiThreadedApplicationAdapter imp
                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 extends 
MultiThreadedApplicationAdapter imp
                return new ArrayList<>();
        }
 
-       private boolean getWhiteboardDrawStatus() {
-               return cfgDao.getWhiteboardDrawStatus();
-       }
-
        public String getCryptKey() {
                return cfgDao.getCryptKey();
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
index 5079c61..c509be4 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ApplicationHelper.java
@@ -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);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
----------------------------------------------------------------------
diff --git 
a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as 
b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
index 23eabbe..cbc0ffe 100644
--- a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
+++ b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
@@ -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 {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-server/src/site/xdoc/Clustering.xml
----------------------------------------------------------------------
diff --git a/openmeetings-server/src/site/xdoc/Clustering.xml 
b/openmeetings-server/src/site/xdoc/Clustering.xml
index a1ccc27..9d073d1 100644
--- a/openmeetings-server/src/site/xdoc/Clustering.xml
+++ b/openmeetings-server/src/site/xdoc/Clustering.xml
@@ -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:

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-server/src/site/xdoc/voip-sip-integration.xml
----------------------------------------------------------------------
diff --git a/openmeetings-server/src/site/xdoc/voip-sip-integration.xml 
b/openmeetings-server/src/site/xdoc/voip-sip-integration.xml
index 9369ee7..72cf707 100644
--- a/openmeetings-server/src/site/xdoc/voip-sip-integration.xml
+++ b/openmeetings-server/src/site/xdoc/voip-sip-integration.xml
@@ -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>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index b40c9e2..0f361dd 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -99,8 +99,7 @@ import org.apache.wicket.request.cycle.RequestCycle;
 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 
AuthenticatedWebApplication implements IApplica
                //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();
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
index 8fa58ff..9ec4dea 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
@@ -34,16 +34,20 @@ import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.IUpdatable;
 import org.apache.openmeetings.web.common.MainPanel;
+import org.apache.openmeetings.web.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 BaseInitedPage implements 
IUpdatable {
                        }
                }
                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));

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index b05150f..c4d9728 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -27,8 +27,6 @@ import static 
org.apache.openmeetings.web.app.Application.getRoomClients;
 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.activities.Activity;
 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.JavaScriptHeaderItem;
 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() {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
new file mode 100644
index 0000000..bd931f7
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.html
@@ -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>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
new file mode 100644
index 0000000..98319fc
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/VideoSettings.java
@@ -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(");");
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/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 1e2c563..989aa20 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
@@ -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');

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js
new file mode 100644
index 0000000..9c96224
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings.js
@@ -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'); }
+       };
+})();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/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 5809dcd..e92ae35 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,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>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/b1c60093/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index b09e688..ffa6ba1 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -34,12 +34,13 @@ import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.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;

Reply via email to