diff --git a/Makefile b/Makefile
index f7e698403..5c6e703aa 100644
--- a/Makefile
+++ b/Makefile
@@ -20,3 +20,7 @@ clean:
deploy:
@mkdir -p $(DEPLOY_DIR) && cp $(OUTPUT_DIR)/*.bundle.js $(DEPLOY_DIR)
+ scp $(DEPLOY_DIR)/*.bundle.js hristo.jitsi.net:/srv/web/hristo.jitsi.net/$(DEPLOY_DIR)
+
+dd: debug deploy
+
diff --git a/api_connector.js b/api_connector.js
index 48db3d333..8281b1eb5 100644
--- a/api_connector.js
+++ b/api_connector.js
@@ -18,12 +18,12 @@ var APIConnector = (function () {
*/
var commands =
{
- displayName: VideoLayout.inputDisplayNameHandler,
+ displayName: UI.inputDisplayNameHandler,
muteAudio: toggleAudio,
muteVideo: toggleVideo,
- toggleFilmStrip: BottomToolbar.toggleFilmStrip,
- toggleChat: BottomToolbar.toggleChat,
- toggleContactList: BottomToolbar.toggleContactList
+ toggleFilmStrip: UI.toggleFilmStrip,
+ toggleChat: UI.toggleChat,
+ toggleContactList: UI.toggleContactList
};
diff --git a/app.js b/app.js
index 35d43da8b..32c82ab23 100644
--- a/app.js
+++ b/app.js
@@ -2,12 +2,9 @@
/* application specific logic */
var connection = null;
var authenticatedUser = false;
-var authenticationWindow = null;
var activecall = null;
var nickname = null;
-var sharedKey = '';
var focusMucJid = null;
-var roomUrl = null;
var roomName = null;
var ssrc2jid = {};
var bridgeIsDown = false;
@@ -59,10 +56,8 @@ var getVideoPosition;
var sessionTerminated = false;
function init() {
- Toolbar.setupButtonsFromConfig();
RTC.addStreamListener(maybeDoJoin, StreamEventTypes.EVENT_TYPE_LOCAL_CREATED);
- RTC.addStreamListener(VideoLayout.onLocalStreamCreated, StreamEventTypes.EVENT_TYPE_LOCAL_CREATED)
RTC.start();
var jid = document.getElementById('jid').value || config.hosts.anonymousdomain || config.hosts.domain || window.location.hostname;
@@ -76,13 +71,14 @@ function connect(jid, password) {
localVideo = connection.jingle.localVideo;
}
connection = new Strophe.Connection(document.getElementById('boshURL').value || config.bosh || '/http-bind');
-
- var email = SettingsMenu.getEmail();
- var displayName = SettingsMenu.getDisplayName();
+
+ var settings = UI.getSettings();
+ var email = settings.email;
+ var displayName = settings.displayName;
if(email) {
connection.emuc.addEmailToPresence(email);
} else {
- connection.emuc.addUserIdToPresence(SettingsMenu.getUID());
+ connection.emuc.addUserIdToPresence(settings.uid);
}
if(displayName) {
connection.emuc.addDisplayNameToPresence(displayName);
@@ -143,41 +139,9 @@ function maybeDoJoin() {
}
}
-function generateRoomName() {
- var roomnode = null;
- var path = window.location.pathname;
-
- // determinde the room node from the url
- // TODO: just the roomnode or the whole bare jid?
- if (config.getroomnode && typeof config.getroomnode === 'function') {
- // custom function might be responsible for doing the pushstate
- roomnode = config.getroomnode(path);
- } else {
- /* fall back to default strategy
- * this is making assumptions about how the URL->room mapping happens.
- * It currently assumes deployment at root, with a rewrite like the
- * following one (for nginx):
- location ~ ^/([a-zA-Z0-9]+)$ {
- rewrite ^/(.*)$ / break;
- }
- */
- if (path.length > 1) {
- roomnode = path.substr(1).toLowerCase();
- } else {
- var word = RoomNameGenerator.generateRoomWithoutSeparator();
- roomnode = word.toLowerCase();
-
- window.history.pushState('VideoChat',
- 'Room: ' + word, window.location.pathname + word);
- }
- }
-
- roomName = roomnode + '@' + config.hosts.muc;
-}
-
function doJoin() {
if (!roomName) {
- generateRoomName();
+ UI.generateRoomName();
}
Moderator.allocateConferenceFocus(
@@ -244,7 +208,6 @@ function waitForRemoteVideo(selector, ssrc, stream, jid) {
jid2Ssrc[Strophe.getResourceFromJid(jid)] = ssrc;
} else {
console.warn("No ssrc given for jid", jid);
-// messageHandler.showError('Warning', 'No ssrc was given for the video.');
}
$(document).trigger('videoactive.jingle', [selector]);
@@ -328,43 +291,7 @@ function waitForPresence(data, sid) {
RTC.createRemoteStream(data, sid, thessrc);
- var container;
- var remotes = document.getElementById('remoteVideos');
-
- if (data.peerjid) {
- VideoLayout.ensurePeerContainerExists(data.peerjid);
-
- container = document.getElementById(
- 'participant_' + Strophe.getResourceFromJid(data.peerjid));
- } else {
- if (data.stream.id !== 'mixedmslabel'
- // FIXME: default stream is added always with new focus
- // (to be investigated)
- && data.stream.id !== 'default') {
- console.error('can not associate stream',
- data.stream.id,
- 'with a participant');
- // We don't want to add it here since it will cause troubles
- return;
- }
- // FIXME: for the mixed ms we dont need a video -- currently
- container = document.createElement('span');
- container.id = 'mixedstream';
- container.className = 'videocontainer';
- remotes.appendChild(container);
- Util.playSoundNotification('userJoined');
- }
-
var isVideo = data.stream.getVideoTracks().length > 0;
-
- if (container) {
- VideoLayout.addRemoteStreamElement( container,
- sid,
- data.stream,
- data.peerjid,
- thessrc);
- }
-
// an attempt to work around https://github.com/jitsi/jitmeet/issues/32
if (isVideo &&
data.peerjid && sess.peerjid === data.peerjid &&
@@ -393,19 +320,19 @@ function sendKeyframe(pc) {
},
function (error) {
console.log('triggerKeyframe setLocalDescription failed', error);
- messageHandler.showError();
+ UI.messageHandler.showError();
}
);
},
function (error) {
console.log('triggerKeyframe createAnswer failed', error);
- messageHandler.showError();
+ UI.messageHandler.showError();
}
);
},
function (error) {
console.log('triggerKeyframe setRemoteDescription failed', error);
- messageHandler.showError();
+ UI.messageHandler.showError();
}
);
}
@@ -433,7 +360,7 @@ function muteVideo(pc, unmute) {
},
function (error) {
console.log('mute SLD error');
- messageHandler.showError('Error',
+ UI.messageHandler.showError('Error',
'Oops! Something went wrong and we failed to ' +
'mute! (SLD Failure)');
}
@@ -441,13 +368,13 @@ function muteVideo(pc, unmute) {
},
function (error) {
console.log(error);
- messageHandler.showError();
+ UI.messageHandler.showError();
}
);
},
function (error) {
console.log('muteVideo SRD error');
- messageHandler.showError('Error',
+ UI.messageHandler.showError('Error',
'Oops! Something went wrong and we failed to stop video!' +
'(SRD Failure)');
@@ -455,53 +382,6 @@ function muteVideo(pc, unmute) {
);
}
-/**
- * Callback for audio levels changed.
- * @param jid JID of the user
- * @param audioLevel the audio level value
- */
-function audioLevelUpdated(jid, audioLevel)
-{
- var resourceJid;
- if(jid === statistics.LOCAL_JID)
- {
- resourceJid = AudioLevels.LOCAL_LEVEL;
- if(isAudioMuted())
- {
- audioLevel = 0;
- }
- }
- else
- {
- resourceJid = Strophe.getResourceFromJid(jid);
- }
-
- AudioLevels.updateAudioLevel(resourceJid, audioLevel);
-}
-
-$(document).bind('callincoming.jingle', function (event, sid) {
- var sess = connection.jingle.sessions[sid];
-
- // TODO: do we check activecall == null?
- activecall = sess;
-
- statistics.onConferenceCreated(sess);
- RTC.onConferenceCreated(sess);
-
- // TODO: check affiliation and/or role
- console.log('emuc data for', sess.peerjid, connection.emuc.members[sess.peerjid]);
- sess.usedrip = true; // not-so-naive trickle ice
- sess.sendAnswer();
- sess.accept();
-
-});
-
-$(document).bind('conferenceCreated.jingle', function (event, focus)
-{
- statistics.onConfereceCreated(getConferenceHandler());
- RTC.onConfereceCreated(focus);
-});
-
$(document).bind('setLocalDescription.jingle', function (event, sid) {
// put our ssrcs into presence so other clients can identify our stream
var sess = connection.jingle.sessions[sid];
@@ -585,115 +465,7 @@ $(document).bind('iceconnectionstatechange.jingle', function (event, sid, sessio
});
$(document).bind('joined.muc', function (event, jid, info) {
- updateRoomUrl(window.location.href);
- document.getElementById('localNick').appendChild(
- document.createTextNode(Strophe.getResourceFromJid(jid) + ' (me)')
- );
- // Add myself to the contact list.
- ContactList.addContact(jid, SettingsMenu.getEmail() || SettingsMenu.getUID());
-
- // Once we've joined the muc show the toolbar
- ToolbarToggler.showToolbar();
-
- // Show authenticate button if needed
- Toolbar.showAuthenticateButton(
- Moderator.isExternalAuthEnabled() && !Moderator.isModerator());
-
- var displayName = !config.displayJids
- ? info.displayName : Strophe.getResourceFromJid(jid);
-
- if (displayName)
- $(document).trigger('displaynamechanged',
- ['localVideoContainer', displayName + ' (me)']);
-});
-
-$(document).bind('entered.muc', function (event, jid, info, pres) {
- console.log('entered', jid, info);
- if (info.isFocus)
- {
- focusMucJid = jid;
- console.info("Ignore focus: " + jid +", real JID: " + info.jid);
- return;
- }
-
- messageHandler.notify(info.displayName || 'Somebody',
- 'connected',
- 'connected');
-
- // Add Peer's container
- var id = $(pres).find('>userID').text();
- var email = $(pres).find('>email');
- if(email.length > 0) {
- id = email.text();
- }
- VideoLayout.ensurePeerContainerExists(jid,id);
-
- if(APIConnector.isEnabled() && APIConnector.isEventEnabled("participantJoined"))
- {
- APIConnector.triggerEvent("participantJoined",{jid: jid});
- }
-
- /*if (focus !== null) {
- // FIXME: this should prepare the video
- if (focus.confid === null) {
- console.log('make new conference with', jid);
- focus.makeConference(Object.keys(connection.emuc.members),
- function(error) {
- connection.emuc.addBridgeIsDownToPresence();
- connection.emuc.sendPresence();
- }
- );
- Toolbar.showRecordingButton(true);
- } else {
- console.log('invite', jid, 'into conference');
- focus.addNewParticipant(jid);
- }
- }*/
-});
-
-$(document).bind('left.muc', function (event, jid) {
- console.log('left.muc', jid);
- var displayName = $('#participant_' + Strophe.getResourceFromJid(jid) +
- '>.displayname').html();
- messageHandler.notify(displayName || 'Somebody',
- 'disconnected',
- 'disconnected');
- // Need to call this with a slight delay, otherwise the element couldn't be
- // found for some reason.
- // XXX(gp) it works fine without the timeout for me (with Chrome 38).
- window.setTimeout(function () {
- var container = document.getElementById(
- 'participant_' + Strophe.getResourceFromJid(jid));
- if (container) {
- ContactList.removeContact(jid);
- VideoLayout.removeConnectionIndicator(jid);
- // hide here, wait for video to close before removing
- $(container).hide();
- VideoLayout.resizeThumbnails();
- }
- }, 10);
-
- if(APIConnector.isEnabled() && APIConnector.isEventEnabled("participantLeft"))
- {
- APIConnector.triggerEvent("participantLeft",{jid: jid});
- }
-
- delete jid2Ssrc[jid];
-
- // Unlock large video
- if (focusedVideoInfo && focusedVideoInfo.jid === jid)
- {
- console.info("Focused video owner has left the conference");
- focusedVideoInfo = null;
- }
-
- connection.jingle.terminateByJid(jid);
-
- if (connection.emuc.getPrezi(jid)) {
- $(document).trigger('presentationremoved.muc',
- [jid, connection.emuc.getPrezi(jid)]);
- }
});
$(document).bind('presence.muc', function (event, jid, info, pres) {
@@ -701,7 +473,7 @@ $(document).bind('presence.muc', function (event, jid, info, pres) {
//check if the video bridge is available
if($(pres).find(">bridgeIsDown").length > 0 && !bridgeIsDown) {
bridgeIsDown = true;
- messageHandler.showError("Error",
+ UI.messageHandler.showError("Error",
"Jitsi Videobridge is currently unavailable. Please try again later!");
}
@@ -756,7 +528,7 @@ $(document).bind('presence.muc', function (event, jid, info, pres) {
//check if the video bridge is available
if($(pres).find(">bridgeIsDown").length > 0 && !bridgeIsDown) {
bridgeIsDown = true;
- messageHandler.showError("Error",
+ UI.messageHandler.showError("Error",
"Jitsi Videobridge is currently unavailable. Please try again later!");
}
@@ -765,14 +537,7 @@ $(document).bind('presence.muc', function (event, jid, info, pres) {
if(email.length > 0) {
id = email.text();
}
- Avatar.setUserAvatar(jid, id);
-
-});
-
-$(document).bind('presence.status.muc', function (event, jid, info, pres) {
-
- VideoLayout.setPresenceStatus(
- 'participant_' + Strophe.getResourceFromJid(jid), info.status);
+ UI.setUserAvatar(jid, id);
});
@@ -782,80 +547,15 @@ $(document).bind('kicked.muc', function (event, jid) {
sessionTerminated = true;
disposeConference(false);
connection.emuc.doLeave();
- messageHandler.openMessageDialog("Session Terminated",
+ UI.messageHandler.openMessageDialog("Session Terminated",
"Ouch! You have been kicked out of the meet!");
}
});
-$(document).bind('role.changed.muc', function (event, jid, member, pres) {
- console.info("Role changed for " + jid + ", new role: " + member.role);
-
- VideoLayout.showModeratorIndicator();
-
- if (member.role === 'moderator') {
- var displayName = member.displayName;
- if (!displayName) {
- displayName = 'Somebody';
- }
- messageHandler.notify(
- displayName,
- 'connected',
- 'Moderator rights granted to ' + displayName + '!');
- }
- }
-);
-
-$(document).bind('local.role.changed.muc', function (event, jid, info, pres) {
-
- console.info("My role changed, new role: " + info.role);
- var isModerator = Moderator.isModerator();
-
- VideoLayout.showModeratorIndicator();
- Toolbar.showAuthenticateButton(
- Moderator.isExternalAuthEnabled() && !isModerator);
-
- if (isModerator) {
- if (authenticationWindow) {
- authenticationWindow.close();
- authenticationWindow = null;
- }
- messageHandler.notify(
- 'Me', 'connected', 'Moderator rights granted !');
- }
- }
-);
-
-$(document).bind('passwordrequired.muc', function (event, jid) {
- console.log('on password required', jid);
-
- // password is required
- Toolbar.lockLockButton();
-
- messageHandler.openTwoButtonDialog(null,
- '
Password required
' +
- '',
- true,
- "Ok",
- function (e, v, m, f) {},
- function (event) {
- document.getElementById('lockKey').focus();
- },
- function (e, v, m, f) {
- if (v) {
- var lockKey = document.getElementById('lockKey');
- if (lockKey.value !== null) {
- setSharedKey(lockKey.value);
- connection.emuc.doJoin(jid, lockKey.value);
- }
- }
- }
- );
-});
-
$(document).bind('passwordrequired.main', function (event) {
console.log('password is required');
- messageHandler.openTwoButtonDialog(null,
+ UI.messageHandler.openTwoButtonDialog(null,
'Password required
' +
'' +
'',
@@ -877,51 +577,6 @@ $(document).bind('passwordrequired.main', function (event) {
);
});
-$(document).bind('auth_required.moderator', function () {
- // extract room name from 'room@muc.server.net'
- var room = roomName.substr(0, roomName.indexOf('@'));
-
- messageHandler.openDialog(
- 'Stop',
- 'Authentication is required to create room:
' + room,
- true,
- {
- Authenticate: 'authNow',
- Close: 'close'
- },
- function (onSubmitEvent, submitValue) {
- console.info('On submit: ' + submitValue, submitValue);
- if (submitValue === 'authNow') {
- authenticateClicked();
- } else {
- Toolbar.showAuthenticateButton(true);
- }
- }
- );
-});
-
-function authenticateClicked() {
- // Get authentication URL
- Moderator.getAuthUrl(function (url) {
- // Open popup with authentication URL
- authenticationWindow = messageHandler.openCenteredPopup(
- url, 500, 400,
- function () {
- // On popup closed - retry room allocation
- Moderator.allocateConferenceFocus(
- roomName, doJoinAfterFocus);
- authenticationWindow = null;
- });
- if (!authenticationWindow) {
- Toolbar.showAuthenticateButton(true);
- messageHandler.openMessageDialog(
- null, "Your browser is blocking popup windows from this site." +
- " Please enable popups in your browser security settings" +
- " and try again.");
- }
- });
-};
-
/**
* Checks if video identified by given src is desktop stream.
* @param videoSrc eg.
@@ -1060,7 +715,7 @@ function setAudioMuted(mute) {
// isMuted is the opposite of audioEnabled
connection.emuc.addAudioInfoToPresence(mute);
connection.emuc.sendPresence();
- VideoLayout.showLocalAudioIndicator(mute);
+ UI.showLocalAudioIndicator(mute);
buttonClick("#mute", "icon-microphone icon-mic-disabled");
}
@@ -1079,11 +734,6 @@ function isAudioMuted()
return true;
}
-// Starts or stops the recording for the conference.
-function toggleRecording() {
- Recording.toggleRecording();
-}
-
/**
* Returns an array of the video horizontal and vertical indents,
* so that if fits its parent.
@@ -1163,151 +813,17 @@ function getCameraVideoSize(videoWidth,
}
$(document).ready(function () {
- document.title = interfaceConfig.APP_NAME;
+
if(APIConnector.isEnabled())
APIConnector.init();
- if(config.enableWelcomePage && window.location.pathname == "/" &&
- (!window.localStorage.welcomePageDisabled
- || window.localStorage.welcomePageDisabled == "false"))
- {
- $("#videoconference_page").hide();
- $("#domain_name").text(
- window.location.protocol + "//" + window.location.host + "/");
- $("span[name='appName']").text(interfaceConfig.APP_NAME);
-
- if (interfaceConfig.SHOW_JITSI_WATERMARK) {
- var leftWatermarkDiv
- = $("#welcome_page_header div[class='watermark leftwatermark']");
- if(leftWatermarkDiv && leftWatermarkDiv.length > 0)
- {
- leftWatermarkDiv.css({display: 'block'});
- leftWatermarkDiv.parent().get(0).href
- = interfaceConfig.JITSI_WATERMARK_LINK;
- }
-
- }
-
- if (interfaceConfig.SHOW_BRAND_WATERMARK) {
- var rightWatermarkDiv
- = $("#welcome_page_header div[class='watermark rightwatermark']");
- if(rightWatermarkDiv && rightWatermarkDiv.length > 0) {
- rightWatermarkDiv.css({display: 'block'});
- rightWatermarkDiv.parent().get(0).href
- = interfaceConfig.BRAND_WATERMARK_LINK;
- rightWatermarkDiv.get(0).style.backgroundImage
- = "url(images/rightwatermark.png)";
- }
- }
-
- if (interfaceConfig.SHOW_POWERED_BY) {
- $("#welcome_page_header>a[class='poweredby']")
- .css({display: 'block'});
- }
-
- function enter_room()
- {
- var val = $("#enter_room_field").val();
- if(!val) {
- val = $("#enter_room_field").attr("room_name");
- }
- if (val) {
- window.location.pathname = "/" + val;
- }
- }
- $("#enter_room_button").click(function()
- {
- enter_room();
- });
-
- $("#enter_room_field").keydown(function (event) {
- if (event.keyCode === 13 /* enter */) {
- enter_room();
- }
- });
-
- if (!(interfaceConfig.GENERATE_ROOMNAMES_ON_WELCOME_PAGE === false)){
- var updateTimeout;
- var animateTimeout;
- $("#reload_roomname").click(function () {
- clearTimeout(updateTimeout);
- clearTimeout(animateTimeout);
- update_roomname();
- });
- $("#reload_roomname").show();
-
- function animate(word) {
- var currentVal = $("#enter_room_field").attr("placeholder");
- $("#enter_room_field").attr("placeholder", currentVal + word.substr(0, 1));
- animateTimeout = setTimeout(function() {
- animate(word.substring(1, word.length))
- }, 70);
- }
-
- function update_roomname()
- {
- var word = RoomNameGenerator.generateRoomWithoutSeparator();
- $("#enter_room_field").attr("room_name", word);
- $("#enter_room_field").attr("placeholder", "");
- clearTimeout(animateTimeout);
- animate(word);
- updateTimeout = setTimeout(update_roomname, 10000);
- }
- update_roomname();
- }
-
- $("#disable_welcome").click(function () {
- window.localStorage.welcomePageDisabled
- = $("#disable_welcome").is(":checked");
- });
-
- return;
- }
-
- if (interfaceConfig.SHOW_JITSI_WATERMARK) {
- var leftWatermarkDiv
- = $("#largeVideoContainer div[class='watermark leftwatermark']");
-
- leftWatermarkDiv.css({display: 'block'});
- leftWatermarkDiv.parent().get(0).href
- = interfaceConfig.JITSI_WATERMARK_LINK;
- }
-
- if (interfaceConfig.SHOW_BRAND_WATERMARK) {
- var rightWatermarkDiv
- = $("#largeVideoContainer div[class='watermark rightwatermark']");
-
- rightWatermarkDiv.css({display: 'block'});
- rightWatermarkDiv.parent().get(0).href
- = interfaceConfig.BRAND_WATERMARK_LINK;
- rightWatermarkDiv.get(0).style.backgroundImage
- = "url(images/rightwatermark.png)";
- }
-
- if (interfaceConfig.SHOW_POWERED_BY) {
- $("#largeVideoContainer>a[class='poweredby']").css({display: 'block'});
- }
-
- $("#welcome_page").hide();
- Chat.init();
-
- $('body').popover({ selector: '[data-toggle=popover]',
- trigger: 'click hover',
- content: function() {
- return this.getAttribute("content") +
- KeyboardShortcut.getShortcut(this.getAttribute("shortcut"));
- }
- });
-
- statistics.addAudioLevelListener(audioLevelUpdated);
+ UI.start();
statistics.addConnectionStatsListener(ConnectionQuality.updateLocalStats);
statistics.addRemoteStatsStopListener(ConnectionQuality.stopSendingStats);
+ statistics.start();
Moderator.init();
- // Set the defaults for prompt dialogs.
- jQuery.prompt.setDefaults({persistent: false});
-
// Set default desktop sharing method
setDesktopSharing(config.desktopSharing);
// Initialize Chrome extension inline installs
@@ -1318,62 +834,6 @@ $(document).ready(function () {
// By default we use camera
getVideoSize = getCameraVideoSize;
getVideoPosition = getCameraVideoPosition;
-
- VideoLayout.resizeLargeVideoContainer();
- $(window).resize(function () {
- VideoLayout.resizeLargeVideoContainer();
- VideoLayout.positionLarge();
- });
- // Listen for large video size updates
- document.getElementById('largeVideo')
- .addEventListener('loadedmetadata', function (e) {
- currentVideoWidth = this.videoWidth;
- currentVideoHeight = this.videoHeight;
- VideoLayout.positionLarge(currentVideoWidth, currentVideoHeight);
- });
-
- document.getElementById('largeVideo').volume = 0;
-
- if (!$('#settings').is(':visible')) {
- console.log('init');
- init();
- } else {
- loginInfo.onsubmit = function (e) {
- if (e.preventDefault) e.preventDefault();
- $('#settings').hide();
- init();
- };
- }
-
- toastr.options = {
- "closeButton": true,
- "debug": false,
- "positionClass": "notification-bottom-right",
- "onclick": null,
- "showDuration": "300",
- "hideDuration": "1000",
- "timeOut": "2000",
- "extendedTimeOut": "1000",
- "showEasing": "swing",
- "hideEasing": "linear",
- "showMethod": "fadeIn",
- "hideMethod": "fadeOut",
- "reposition": function() {
- if(PanelToggler.isVisible()) {
- $("#toast-container").addClass("notification-bottom-right-center");
- } else {
- $("#toast-container").removeClass("notification-bottom-right-center");
- }
- },
- "newestOnTop": false
- };
-
- $('#settingsmenu>input').keyup(function(event){
- if(event.keyCode === 13) {//enter
- SettingsMenu.update();
- }
- })
-
});
$(window).bind('beforeunload', function () {
@@ -1404,9 +864,7 @@ $(window).bind('beforeunload', function () {
});
function disposeConference(onUnload) {
-
- Toolbar.showAuthenticateButton(false);
-
+ UI.onDisposeConference(onUnload);
var handler = getConferenceHandler();
if (handler && handler.peerconnection) {
// FIXME: probably removing streams is not required and close() should
@@ -1469,37 +927,6 @@ function buttonClick(id, classname) {
$(id).toggleClass(classname); // add the class to the clicked element
}
-/**
- * Locks / unlocks the room.
- */
-function lockRoom(lock) {
- if (lock)
- connection.emuc.lockRoom(sharedKey);
- else
- connection.emuc.lockRoom('');
-}
-
-/**
- * Sets the shared key.
- */
-function setSharedKey(sKey) {
- sharedKey = sKey;
-}
-
-/**
- * Updates the room invite url.
- */
-function updateRoomUrl(newRoomUrl) {
- roomUrl = newRoomUrl;
-
- // If the invite dialog has been already opened we update the information.
- var inviteLink = document.getElementById('inviteLinkRef');
- if (inviteLink) {
- inviteLink.value = roomUrl;
- inviteLink.select();
- document.getElementById('jqi_state0_buttonInvite').disabled = false;
- }
-}
/**
* Warning to the user that the conference window is about to be closed.
@@ -1514,19 +941,6 @@ function closePageWarning() {
return "You are about to leave this conversation.";
}
-/**
- * Resizes and repositions videos in full screen mode.
- */
-$(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange',
- function () {
- VideoLayout.resizeLargeVideoContainer();
- VideoLayout.positionLarge();
- isFullScreen = document.fullScreen ||
- document.mozFullScreen ||
- document.webkitIsFullScreen;
-
- }
-);
$(document).bind('error.jingle',
function (event, session, error)
@@ -1540,7 +954,7 @@ $(document).bind('fatalError.jingle',
{
sessionTerminated = true;
connection.emuc.doLeave();
- messageHandler.showError( "Sorry",
+ UI.messageHandler.showError( "Sorry",
"Internal application error[setRemoteDescription]");
}
);
@@ -1550,7 +964,7 @@ function callSipButtonClicked()
var defaultNumber
= config.defaultSipNumber ? config.defaultSipNumber : '';
- messageHandler.openTwoButtonDialog(null,
+ UI.messageHandler.openTwoButtonDialog(null,
'Enter SIP number
' +
'',
diff --git a/chat.js b/chat.js
deleted file mode 100644
index f93b61f8c..000000000
--- a/chat.js
+++ /dev/null
@@ -1,343 +0,0 @@
-/* global $, Util, connection, nickname:true, getVideoSize, getVideoPosition, showToolbar, processReplacements */
-/**
- * Chat related user interface.
- */
-var Chat = (function (my) {
- var notificationInterval = false;
- var unreadMessages = 0;
-
- /**
- * Initializes chat related interface.
- */
- my.init = function () {
- var storedDisplayName = window.localStorage.displayname;
- if (storedDisplayName) {
- nickname = storedDisplayName;
-
- Chat.setChatConversationMode(true);
- }
-
- $('#nickinput').keydown(function (event) {
- if (event.keyCode === 13) {
- event.preventDefault();
- var val = Util.escapeHtml(this.value);
- this.value = '';
- if (!nickname) {
- nickname = val;
- window.localStorage.displayname = nickname;
-
- connection.emuc.addDisplayNameToPresence(nickname);
- connection.emuc.sendPresence();
-
- Chat.setChatConversationMode(true);
-
- return;
- }
- }
- });
-
- $('#usermsg').keydown(function (event) {
- if (event.keyCode === 13) {
- event.preventDefault();
- var value = this.value;
- $('#usermsg').val('').trigger('autosize.resize');
- this.focus();
- var command = new CommandsProcessor(value);
- if(command.isCommand())
- {
- command.processCommand();
- }
- else
- {
- var message = Util.escapeHtml(value);
- connection.emuc.sendMessage(message, nickname);
- }
- }
- });
-
- var onTextAreaResize = function () {
- resizeChatConversation();
- Chat.scrollChatToBottom();
- };
- $('#usermsg').autosize({callback: onTextAreaResize});
-
- $("#chatspace").bind("shown",
- function () {
- unreadMessages = 0;
- setVisualNotification(false);
- });
-
- addSmileys();
- };
-
- /**
- * Appends the given message to the chat conversation.
- */
- my.updateChatConversation = function (from, displayName, message) {
- var divClassName = '';
-
- if (connection.emuc.myroomjid === from) {
- divClassName = "localuser";
- }
- else {
- divClassName = "remoteuser";
-
- if (!Chat.isVisible()) {
- unreadMessages++;
- Util.playSoundNotification('chatNotification');
- setVisualNotification(true);
- }
- }
-
- //replace links and smileys
- var escMessage = message.replace(//g, '>').replace(/\n/g, '
'); //Strophe already escapes special symbols on sending, so we escape here only tags to avoid double &
- var escDisplayName = Util.escapeHtml(displayName);
- message = processReplacements(escMessage);
-
- var messageContainer =
- ''+
- '
' +
- '
' + escDisplayName + '
' +
- '
' + getCurrentTime() + '
' +
- '
' + message + '
' +
- '
';
-
- $('#chatconversation').append(messageContainer);
- $('#chatconversation').animate(
- { scrollTop: $('#chatconversation')[0].scrollHeight}, 1000);
- };
-
- /**
- * Appends error message to the conversation
- * @param errorMessage the received error message.
- * @param originalText the original message.
- */
- my.chatAddError = function(errorMessage, originalText)
- {
- errorMessage = Util.escapeHtml(errorMessage);
- originalText = Util.escapeHtml(originalText);
-
- $('#chatconversation').append('Error: '
- + 'Your message' + (originalText? (' \"'+ originalText + '\"') : "")
- + ' was not sent.' + (errorMessage? (' Reason: ' + errorMessage) : '')
- + '
');
- $('#chatconversation').animate(
- { scrollTop: $('#chatconversation')[0].scrollHeight}, 1000);
- };
-
- /**
- * Sets the subject to the UI
- * @param subject the subject
- */
- my.chatSetSubject = function(subject)
- {
- if(subject)
- subject = subject.trim();
- $('#subject').html(linkify(Util.escapeHtml(subject)));
- if(subject == "")
- {
- $("#subject").css({display: "none"});
- }
- else
- {
- $("#subject").css({display: "block"});
- }
- };
-
-
-
- /**
- * Sets the chat conversation mode.
- */
- my.setChatConversationMode = function (isConversationMode) {
- if (isConversationMode) {
- $('#nickname').css({visibility: 'hidden'});
- $('#chatconversation').css({visibility: 'visible'});
- $('#usermsg').css({visibility: 'visible'});
- $('#smileysarea').css({visibility: 'visible'});
- $('#usermsg').focus();
- }
- };
-
- /**
- * Resizes the chat area.
- */
- my.resizeChat = function () {
- var chatSize = PanelToggler.getPanelSize();
-
- $('#chatspace').width(chatSize[0]);
- $('#chatspace').height(chatSize[1]);
-
- resizeChatConversation();
- };
-
- /**
- * Indicates if the chat is currently visible.
- */
- my.isVisible = function () {
- return $('#chatspace').is(":visible");
- };
- /**
- * Shows and hides the window with the smileys
- */
- my.toggleSmileys = function() {
- var smileys = $('#smileysContainer');
- if(!smileys.is(':visible')) {
- smileys.show("slide", { direction: "down", duration: 300});
- } else {
- smileys.hide("slide", { direction: "down", duration: 300});
- }
- $('#usermsg').focus();
- };
-
- /**
- * Scrolls chat to the bottom.
- */
- my.scrollChatToBottom = function() {
- setTimeout(function () {
- $('#chatconversation').scrollTop(
- $('#chatconversation')[0].scrollHeight);
- }, 5);
- };
-
- /**
- * Adds the smileys container to the chat
- */
- function addSmileys() {
- var smileysContainer = document.createElement('div');
- smileysContainer.id = 'smileysContainer';
- function addClickFunction(smiley, number) {
- smiley.onclick = function addSmileyToMessage() {
- var usermsg = $('#usermsg');
- var message = usermsg.val();
- message += smileys['smiley' + number];
- usermsg.val(message);
- usermsg.get(0).setSelectionRange(message.length, message.length);
- Chat.toggleSmileys();
- usermsg.focus();
- };
- }
- for(var i = 1; i <= 21; i++) {
- var smileyContainer = document.createElement('div');
- smileyContainer.id = 'smiley' + i;
- smileyContainer.className = 'smileyContainer';
- var smiley = document.createElement('img');
- smiley.src = 'images/smileys/smiley' + i + '.svg';
- smiley.className = 'smiley';
- addClickFunction(smiley, i);
- smileyContainer.appendChild(smiley);
- smileysContainer.appendChild(smileyContainer);
- }
-
- $("#chatspace").append(smileysContainer);
- }
-
- /**
- * Resizes the chat conversation.
- */
- function resizeChatConversation() {
- var msgareaHeight = $('#usermsg').outerHeight();
- var chatspace = $('#chatspace');
- var width = chatspace.width();
- var chat = $('#chatconversation');
- var smileys = $('#smileysarea');
-
- smileys.height(msgareaHeight);
- $("#smileys").css('bottom', (msgareaHeight - 26) / 2);
- $('#smileysContainer').css('bottom', msgareaHeight);
- chat.width(width - 10);
- chat.height(window.innerHeight - 15 - msgareaHeight);
- }
-
- /**
- * Shows/hides a visual notification, indicating that a message has arrived.
- */
- function setVisualNotification(show) {
- var unreadMsgElement = document.getElementById('unreadMessages');
- var unreadMsgBottomElement = document.getElementById('bottomUnreadMessages');
-
- var glower = $('#chatButton');
- var bottomGlower = $('#chatBottomButton');
-
- if (unreadMessages) {
- unreadMsgElement.innerHTML = unreadMessages.toString();
- unreadMsgBottomElement.innerHTML = unreadMessages.toString();
-
- ToolbarToggler.dockToolbar(true);
-
- var chatButtonElement
- = document.getElementById('chatButton').parentNode;
- var leftIndent = (Util.getTextWidth(chatButtonElement) -
- Util.getTextWidth(unreadMsgElement)) / 2;
- var topIndent = (Util.getTextHeight(chatButtonElement) -
- Util.getTextHeight(unreadMsgElement)) / 2 - 3;
-
- unreadMsgElement.setAttribute(
- 'style',
- 'top:' + topIndent +
- '; left:' + leftIndent + ';');
-
- var chatBottomButtonElement
- = document.getElementById('chatBottomButton').parentNode;
- var bottomLeftIndent = (Util.getTextWidth(chatBottomButtonElement) -
- Util.getTextWidth(unreadMsgBottomElement)) / 2;
- var bottomTopIndent = (Util.getTextHeight(chatBottomButtonElement) -
- Util.getTextHeight(unreadMsgBottomElement)) / 2 - 2;
-
- unreadMsgBottomElement.setAttribute(
- 'style',
- 'top:' + bottomTopIndent +
- '; left:' + bottomLeftIndent + ';');
-
-
- if (!glower.hasClass('icon-chat-simple')) {
- glower.removeClass('icon-chat');
- glower.addClass('icon-chat-simple');
- }
- }
- else {
- unreadMsgElement.innerHTML = '';
- unreadMsgBottomElement.innerHTML = '';
- glower.removeClass('icon-chat-simple');
- glower.addClass('icon-chat');
- }
-
- if (show && !notificationInterval) {
- notificationInterval = window.setInterval(function () {
- glower.toggleClass('active');
- bottomGlower.toggleClass('active glowing');
- }, 800);
- }
- else if (!show && notificationInterval) {
- window.clearInterval(notificationInterval);
- notificationInterval = false;
- glower.removeClass('active');
- bottomGlower.removeClass('glowing');
- bottomGlower.addClass('active');
- }
- }
-
-
- /**
- * Returns the current time in the format it is shown to the user
- * @returns {string}
- */
- function getCurrentTime() {
- var now = new Date();
- var hour = now.getHours();
- var minute = now.getMinutes();
- var second = now.getSeconds();
- if(hour.toString().length === 1) {
- hour = '0'+hour;
- }
- if(minute.toString().length === 1) {
- minute = '0'+minute;
- }
- if(second.toString().length === 1) {
- second = '0'+second;
- }
- return hour+':'+minute+':'+second;
- }
-
- return my;
-}(Chat || {}));
diff --git a/commands.js b/commands.js
deleted file mode 100644
index 110e8cf1c..000000000
--- a/commands.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Handles commands received via chat messages.
- */
-var CommandsProcessor = (function()
-{
- /**
- * Constructs new CommandProccessor instance from a message.
- * @param message the message
- * @constructor
- */
- function CommandsPrototype(message)
- {
- /**
- * Extracts the command from the message.
- * @param message the received message
- * @returns {string} the command
- */
- function getCommand(message)
- {
- if(message)
- {
- for(var command in commands)
- {
- if(message.indexOf("/" + command) == 0)
- return command;
- }
- }
- return "";
- };
-
- var command = getCommand(message);
-
- /**
- * Returns the name of the command.
- * @returns {String} the command
- */
- this.getCommand = function()
- {
- return command;
- }
-
-
- var messageArgument = message.substr(command.length + 2);
-
- /**
- * Returns the arguments of the command.
- * @returns {string}
- */
- this.getArgument = function()
- {
- return messageArgument;
- }
- }
-
- /**
- * Checks whether this instance is valid command or not.
- * @returns {boolean}
- */
- CommandsPrototype.prototype.isCommand = function()
- {
- if(this.getCommand())
- return true;
- return false;
- }
-
- /**
- * Processes the command.
- */
- CommandsPrototype.prototype.processCommand = function()
- {
- if(!this.isCommand())
- return;
-
- commands[this.getCommand()](this.getArgument());
-
- }
-
- /**
- * Processes the data for topic command.
- * @param commandArguments the arguments of the topic command.
- */
- var processTopic = function(commandArguments)
- {
- var topic = Util.escapeHtml(commandArguments);
- connection.emuc.setSubject(topic);
- }
-
- /**
- * List with supported commands. The keys are the names of the commands and
- * the value is the function that processes the message.
- * @type {{String: function}}
- */
- var commands = {
- "topic" : processTopic
- };
-
- return CommandsPrototype;
-})();
diff --git a/connectionquality.js b/connectionquality.js
index 4931631da..73390a7d0 100644
--- a/connectionquality.js
+++ b/connectionquality.js
@@ -32,7 +32,7 @@ var ConnectionQuality = (function () {
*/
ConnectionQuality.updateLocalStats = function (data) {
stats = data;
- VideoLayout.updateLocalConnectionStats(100 - stats.packetLoss.total,stats);
+ UI.updateLocalConnectionStats(100 - stats.packetLoss.total,stats);
if(sendIntervalId == null)
{
startSendingStats();
@@ -97,12 +97,12 @@ var ConnectionQuality = (function () {
ConnectionQuality.updateRemoteStats = function (jid, data) {
if(data == null || data.packetLoss_total == null)
{
- VideoLayout.updateConnectionStats(jid, null, null);
+ UI.updateConnectionStats(jid, null, null);
return;
}
remoteStats[jid] = parseMUCStats(data);
- VideoLayout.updateConnectionStats(jid, 100 - data.packetLoss_total,remoteStats[jid]);
+ UI.updateConnectionStats(jid, 100 - data.packetLoss_total,remoteStats[jid]);
};
@@ -113,7 +113,7 @@ var ConnectionQuality = (function () {
clearInterval(sendIntervalId);
sendIntervalId = null;
//notify UI about stopping statistics gathering
- VideoLayout.onStatsStop();
+ UI.onStatsStop();
};
/**
diff --git a/desktopsharing.js b/desktopsharing.js
index c8d8eaeb3..4b162614c 100644
--- a/desktopsharing.js
+++ b/desktopsharing.js
@@ -1,4 +1,4 @@
-/* global $, alert, changeLocalVideo, chrome, config, connection, getConferenceHandler, getUserMediaWithConstraints, VideoLayout */
+/* global $, alert, changeLocalVideo, chrome, config, connection, getConferenceHandler, getUserMediaWithConstraints */
/**
* Indicates that desktop stream is currently in use(for toggle purpose).
* @type {boolean}
@@ -86,7 +86,7 @@ function isUpdateRequired(minVersion, extVersion)
catch (e)
{
console.error("Failed to parse extension version", e);
- messageHandler.showError('Error',
+ UI.messageHandler.showError('Error',
'Error when trying to detect desktopsharing extension.');
return true;
}
@@ -168,7 +168,7 @@ function obtainScreenFromExtension(streamCallback, failCallback) {
function (arg) {
console.log("Failed to install the extension", arg);
failCallback(arg);
- messageHandler.showError('Error',
+ UI.messageHandler.showError('Error',
'Failed to install desktop sharing extension');
}
);
@@ -247,7 +247,7 @@ function streamSwitchDone() {
//window.setTimeout(
// function () {
switchInProgress = false;
- Toolbar.changeDesktopSharingButtonState(isUsingScreenStream);
+ UI.changeDesktopSharingButtonState(isUsingScreenStream);
// }, 100
//);
}
@@ -258,7 +258,7 @@ function newStreamCreated(stream) {
connection.jingle.localVideo = stream;
- VideoLayout.changeLocalVideo(stream, !isUsingScreenStream);
+ UI.changeLocalVideo(stream, !isUsingScreenStream);
var conferenceHandler = getConferenceHandler();
if (conferenceHandler) {
@@ -267,7 +267,7 @@ function newStreamCreated(stream) {
} else {
// We are done immediately
console.error("No conference handler");
- messageHandler.showError('Error',
+ UI.messageHandler.showError('Error',
'Unable to switch video stream.');
streamSwitchDone();
}
diff --git a/etherpad.js b/etherpad.js
deleted file mode 100644
index 157fe09b2..000000000
--- a/etherpad.js
+++ /dev/null
@@ -1,206 +0,0 @@
-/* global $, config, connection, dockToolbar, Moderator, Prezi,
- setLargeVideoVisible, ToolbarToggler, Util, VideoLayout */
-var Etherpad = (function (my) {
- var etherpadName = null;
- var etherpadIFrame = null;
- var domain = null;
- var options = "?showControls=true&showChat=false&showLineNumbers=true&useMonospaceFont=false";
-
- /**
- * Initializes the etherpad.
- */
- my.init = function (name) {
-
- if (config.etherpad_base && !etherpadName) {
-
- domain = config.etherpad_base;
-
- if (!name) {
- // In case we're the focus we generate the name.
- etherpadName = Math.random().toString(36).substring(7) +
- '_' + (new Date().getTime()).toString();
- shareEtherpad();
- }
- else
- etherpadName = name;
-
- enableEtherpadButton();
- }
- };
-
- /**
- * Opens/hides the Etherpad.
- */
- my.toggleEtherpad = function (isPresentation) {
- if (!etherpadIFrame)
- createIFrame();
-
- var largeVideo = null;
- if (Prezi.isPresentationVisible())
- largeVideo = $('#presentation>iframe');
- else
- largeVideo = $('#largeVideo');
-
- if ($('#etherpad>iframe').css('visibility') === 'hidden') {
- $('#activeSpeaker').css('visibility', 'hidden');
- largeVideo.fadeOut(300, function () {
- if (Prezi.isPresentationVisible()) {
- largeVideo.css({opacity: '0'});
- } else {
- VideoLayout.setLargeVideoVisible(false);
- }
- });
-
- $('#etherpad>iframe').fadeIn(300, function () {
- document.body.style.background = '#eeeeee';
- $('#etherpad>iframe').css({visibility: 'visible'});
- $('#etherpad').css({zIndex: 2});
- });
- }
- else if ($('#etherpad>iframe')) {
- $('#etherpad>iframe').fadeOut(300, function () {
- $('#etherpad>iframe').css({visibility: 'hidden'});
- $('#etherpad').css({zIndex: 0});
- document.body.style.background = 'black';
- });
-
- if (!isPresentation) {
- $('#largeVideo').fadeIn(300, function () {
- VideoLayout.setLargeVideoVisible(true);
- });
- }
- }
- resize();
- };
-
- my.isVisible = function() {
- var etherpadIframe = $('#etherpad>iframe');
- return etherpadIframe && etherpadIframe.is(':visible');
- };
-
- /**
- * Resizes the etherpad.
- */
- function resize() {
- if ($('#etherpad>iframe').length) {
- var remoteVideos = $('#remoteVideos');
- var availableHeight
- = window.innerHeight - remoteVideos.outerHeight();
- var availableWidth = Util.getAvailableVideoWidth();
-
- $('#etherpad>iframe').width(availableWidth);
- $('#etherpad>iframe').height(availableHeight);
- }
- }
-
- /**
- * Shares the Etherpad name with other participants.
- */
- function shareEtherpad() {
- connection.emuc.addEtherpadToPresence(etherpadName);
- connection.emuc.sendPresence();
- }
-
- /**
- * Creates the Etherpad button and adds it to the toolbar.
- */
- function enableEtherpadButton() {
- if (!$('#etherpadButton').is(":visible"))
- $('#etherpadButton').css({display: 'inline-block'});
- }
-
- /**
- * Creates the IFrame for the etherpad.
- */
- function createIFrame() {
- etherpadIFrame = document.createElement('iframe');
- etherpadIFrame.src = domain + etherpadName + options;
- etherpadIFrame.frameBorder = 0;
- etherpadIFrame.scrolling = "no";
- etherpadIFrame.width = $('#largeVideoContainer').width() || 640;
- etherpadIFrame.height = $('#largeVideoContainer').height() || 480;
- etherpadIFrame.setAttribute('style', 'visibility: hidden;');
-
- document.getElementById('etherpad').appendChild(etherpadIFrame);
-
- etherpadIFrame.onload = function() {
-
- document.domain = document.domain;
- bubbleIframeMouseMove(etherpadIFrame);
- setTimeout(function() {
- //the iframes inside of the etherpad are not yet loaded when the etherpad iframe is loaded
- var outer = etherpadIFrame.contentDocument.getElementsByName("ace_outer")[0];
- bubbleIframeMouseMove(outer);
- var inner = outer.contentDocument.getElementsByName("ace_inner")[0];
- bubbleIframeMouseMove(inner);
- }, 2000);
- };
- }
-
- function bubbleIframeMouseMove(iframe){
- var existingOnMouseMove = iframe.contentWindow.onmousemove;
- iframe.contentWindow.onmousemove = function(e){
- if(existingOnMouseMove) existingOnMouseMove(e);
- var evt = document.createEvent("MouseEvents");
- var boundingClientRect = iframe.getBoundingClientRect();
- evt.initMouseEvent(
- "mousemove",
- true, // bubbles
- false, // not cancelable
- window,
- e.detail,
- e.screenX,
- e.screenY,
- e.clientX + boundingClientRect.left,
- e.clientY + boundingClientRect.top,
- e.ctrlKey,
- e.altKey,
- e.shiftKey,
- e.metaKey,
- e.button,
- null // no related element
- );
- iframe.dispatchEvent(evt);
- };
- }
-
- /**
- * On Etherpad added to muc.
- */
- $(document).bind('etherpadadded.muc', function (event, jid, etherpadName) {
- console.log("Etherpad added", etherpadName);
- if (config.etherpad_base && !Moderator.isModerator()) {
- Etherpad.init(etherpadName);
- }
- });
-
- /**
- * On focus changed event.
- */
- // FIXME: there is no such event as 'focusechanged.muc'
- $(document).bind('focusechanged.muc', function (event, focus) {
- console.log("Focus changed");
- if (config.etherpad_base)
- shareEtherpad();
- });
-
- /**
- * On video selected event.
- */
- $(document).bind('video.selected', function (event, isPresentation) {
- if (!config.etherpad_base)
- return;
-
- if (etherpadIFrame && etherpadIFrame.style.visibility !== 'hidden')
- Etherpad.toggleEtherpad(isPresentation);
- });
-
- /**
- * Resizes the etherpad, when the window is resized.
- */
- $(window).resize(function () {
- resize();
- });
-
- return my;
-}(Etherpad || {}));
diff --git a/index.html b/index.html
index d7bf69dd5..f79f01437 100644
--- a/index.html
+++ b/index.html
@@ -31,44 +31,24 @@
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -89,7 +69,6 @@
-
@@ -179,36 +158,36 @@