Pārlūkot izejas kodu

Beta version of the new meet.jit.si interface.

master
yanas 11 gadus atpakaļ
vecāks
revīzija
102680512b
16 mainītis faili ar 1114 papildinājumiem un 592 dzēšanām
  1. 285
    304
      app.js
  2. 92
    25
      chat.js
  3. 71
    0
      css/font.css
  4. 11
    239
      css/main.css
  5. 226
    0
      css/videolayout_default.css
  6. 38
    6
      etherpad.js
  7. Binārs
      fonts/jitsi.eot
  8. 25
    0
      fonts/jitsi.svg
  9. Binārs
      fonts/jitsi.ttf
  10. Binārs
      fonts/jitsi.woff
  11. Binārs
      images/avatar1.png
  12. Binārs
      images/avatarprezi.png
  13. Binārs
      images/watermark.png
  14. 22
    18
      index.html
  15. 333
    0
      prezi.js
  16. 11
    0
      util.js

+ 285
- 304
app.js Parādīt failu

@@ -10,7 +10,10 @@ var roomUrl = null;
10 10
 var ssrc2jid = {};
11 11
 var localVideoSrc = null;
12 12
 var flipXLocalVideo = true;
13
-var preziPlayer = null;
13
+var isFullScreen = false;
14
+var toolbarTimeout = null;
15
+var currentVideoWidth = null;
16
+var currentVideoHeight = null;
14 17
 
15 18
 /* window.onbeforeunload = closePageWarning; */
16 19
 
@@ -154,7 +157,6 @@ function doJoin() {
154 157
 }
155 158
 
156 159
 function change_local_audio(stream) {
157
-
158 160
     connection.jingle.localAudio = stream;
159 161
     RTC.attachMediaStream($('#localAudio'), stream);
160 162
     document.getElementById('localAudio').autoplay = true;
@@ -171,7 +173,11 @@ function change_local_video(stream, flipX) {
171 173
     localVideo.volume = 0; // is it required if audio is separated ?
172 174
     localVideo.oncontextmenu = function () { return false; };
173 175
 
174
-    var localVideoContainer = document.getElementById('localVideoContainer');
176
+    localVideo.addEventListener('loadedmetadata', function(e){
177
+        positionLarge(this.videoWidth, this.videoHeight);
178
+    });
179
+
180
+    var localVideoContainer = document.getElementById('localVideoWrapper');
175 181
     localVideoContainer.appendChild(localVideo);
176 182
 
177 183
     var localVideoSelector = $('#' + localVideo.id);
@@ -265,7 +271,17 @@ $(document).bind('remotestreamadded.jingle', function (event, data, sid) {
265 271
     vid.id = id;
266 272
     vid.autoplay = true;
267 273
     vid.oncontextmenu = function () { return false; };
274
+
275
+    vid.addEventListener('loadedmetadata', function(e){
276
+        positionLarge(this.videoWidth, this.videoHeight);
277
+    });
278
+
268 279
     container.appendChild(vid);
280
+    var sel = $('#' + id);
281
+    sel.hide();
282
+    RTC.attachMediaStream(sel, data.stream);
283
+    waitForRemoteVideo(sel, sid);
284
+
269 285
     // TODO: make mixedstream display:none via css?
270 286
     if (id.indexOf('mixedmslabel') !== -1) {
271 287
         container.id = 'mixedstream';
@@ -555,6 +571,7 @@ $(document).bind('entered.muc', function (event, jid, info, pres) {
555 571
         showDisplayName(videoSpanId, info.displayName);
556 572
 
557 573
     var nickfield = document.createElement('span');
574
+    nickfield.className = "nick";
558 575
     nickfield.appendChild(document.createTextNode(Strophe.getResourceFromJid(jid)));
559 576
     container.appendChild(nickfield);
560 577
     resizeThumbnails();
@@ -681,160 +698,20 @@ $(document).bind('passwordrequired.muc', function (event, jid) {
681 698
             });
682 699
 });
683 700
 
684
-/*
685
- * Presentation has been removed.
686
- */
687
-$(document).bind('presentationremoved.muc', function(event, jid, presUrl) {
688
-    console.log('presentation removed', presUrl);
689
-    var presId = getPresentationId(presUrl);
690
-    setPresentationVisible(false);
691
-    $('#participant_' + Strophe.getResourceFromJid(jid) + '_' + presId).remove();
692
-    $('#presentation>iframe').remove();
693
-    if (preziPlayer !== null) {
694
-        preziPlayer.destroy();
695
-        preziPlayer = null;
696
-    }
697
-});
698
-
699
-/*
700
- * Presentation has been added.
701
- */
702
-$(document).bind('presentationadded.muc', function (event, jid, presUrl, currentSlide) {
703
-    console.log("presentation added", presUrl);
704
-
705
-    var presId = getPresentationId(presUrl);
706
-    var elementId = 'participant_' + Strophe.getResourceFromJid(jid) + '_' + presId;
707
-
708
-    var container = addRemoteVideoContainer(elementId);
709
-    resizeThumbnails();
710
-
711
-    var controlsEnabled = false;
712
-    if (jid === connection.emuc.myroomjid)
713
-        controlsEnabled = true;
714
-
715
-    setPresentationVisible(true);
716
-    $('#largeVideoContainer').hover(
717
-        function (event) {
718
-            if (isPresentationVisible())
719
-                $('#reloadPresentation').css({display:'inline-block'});
720
-        },
721
-        function (event) {
722
-            if (!isPresentationVisible())
723
-                $('#reloadPresentation').css({display:'none'});
724
-            else {
725
-                var e = event.toElement || event.relatedTarget;
726
-
727
-                while(e && e.parentNode && e.parentNode !== window) {
728
-                    if (e.parentNode === this || e === this) {
729
-                        return false;
730
-                    }
731
-                    e = e.parentNode;
732
-                }
733
-                $('#reloadPresentation').css({display:'none'});
734
-            }
735
-        });
736
-
737
-    preziPlayer = new PreziPlayer(
738
-                'presentation',
739
-                {preziId: presId,
740
-                width: $('#largeVideoContainer').width(),
741
-                height: $('#largeVideoContainer').height(),
742
-                controls: controlsEnabled,
743
-                debug: true
744
-                });
745
-
746
-    $('#presentation>iframe').attr('id', preziPlayer.options.preziId);
747
-
748
-    preziPlayer.on(PreziPlayer.EVENT_STATUS, function(event) {
749
-        console.log("prezi status", event.value);
750
-        if (event.value === PreziPlayer.STATUS_CONTENT_READY) {
751
-            if (jid !== connection.emuc.myroomjid)
752
-                preziPlayer.flyToStep(currentSlide);
753
-        }
754
-    });
755
-
756
-    preziPlayer.on(PreziPlayer.EVENT_CURRENT_STEP, function(event) {
757
-        console.log("event value", event.value);
758
-        connection.emuc.addCurrentSlideToPresence(event.value);
759
-        connection.emuc.sendPresence();
760
-    });
761
-
762
-    $("#" + elementId).css('background-image','url(../images/avatarprezi.png)');
763
-    $("#" + elementId).click(
764
-        function () {
765
-            setPresentationVisible(true);
766
-        }
767
-    );
768
-});
769
-
770
-/*
771
- * Indicates presentation slide change.
772
- */
773
-$(document).bind('gotoslide.muc', function (event, jid, presUrl, current) {
774
-    if (preziPlayer) {
775
-        preziPlayer.flyToStep(current);
776
-    }
777
-});
778
-
779
-/**
780
- * Returns the presentation id from the given url.
781
- */
782
-function getPresentationId (presUrl) {
783
-    var presIdTmp = presUrl.substring(presUrl.indexOf("prezi.com/") + 10);
784
-    return presIdTmp.substring(0, presIdTmp.indexOf('/'));
785
-}
786
-
787
-/*
788
- * Reloads the current presentation.
789
- */
790
-function reloadPresentation() {
791
-    var iframe = document.getElementById(preziPlayer.options.preziId);
792
-    iframe.src = iframe.src;
793
-}
794
-
795
-/*
796
- * Shows/hides a presentation.
797
- */
798
-function setPresentationVisible(visible) {
799
-    if (visible) {
800
-        // Trigger the video.selected event to indicate a change in the large video.
801
-        $(document).trigger("video.selected", [true]);
802
-
803
-        $('#largeVideo').fadeOut(300, function () {
804
-            $('#largeVideo').css({visibility:'hidden'});
805
-            $('#presentation>iframe').fadeIn(300, function() {
806
-                $('#presentation>iframe').css({opacity:'1'});
807
-            });
808
-        });
809
-    }
810
-    else {
811
-        if ($('#presentation>iframe')) {
812
-            $('#presentation>iframe').fadeOut(300, function () {
813
-                $('#presentation>iframe').css({opacity:'0'});
814
-                $('#largeVideo').fadeIn(300, function() {
815
-                    $('#largeVideo').css({visibility:'visible'});
816
-                });
817
-            });
818
-        }
819
-    }
820
-}
821
-
822
-function isPresentationVisible() {
823
-    return ($('#presentation>iframe') !== null && $('#presentation>iframe').css('opacity') == 1);
824
-}
825
-
826 701
 /**
827 702
  * Updates the large video with the given new video source.
828 703
  */
829 704
 function updateLargeVideo(newSrc, vol) {
830 705
     console.log('hover in', newSrc);
831 706
 
832
-    setPresentationVisible(false);
833
-
834
-    if ($('#largeVideo').attr('src') !== newSrc) {
707
+    if ($('#largeVideo').attr('src') != newSrc) {
708
+        document.getElementById('largeVideo')
709
+            .addEventListener('loadedmetadata', function(e){
710
+                currentVideoWidth = this.videoWidth;
711
+                currentVideoHeight = this.videoHeight;
712
+        });
835 713
 
836
-        // FIXME: is it still required ? audio is separated
837
-        //document.getElementById('largeVideo').volume = vol;
714
+        var isVisible = $('#largeVideo').is(':visible');
838 715
 
839 716
         $('#largeVideo').fadeOut(300, function () {
840 717
             $(this).attr('src', newSrc);
@@ -850,11 +727,26 @@ function updateLargeVideo(newSrc, vol) {
850 727
                 document.getElementById('largeVideo').style.webkitTransform = "none";
851 728
             }
852 729
 
853
-            $(this).fadeIn(300);
730
+            if (isVisible)
731
+                $(this).fadeIn(300);
854 732
         });
855 733
     }
856 734
 }
857 735
 
736
+/**
737
+ * Shows/hides the large video.
738
+ */
739
+function setLargeVideoVisible(isVisible) {
740
+    if (isVisible) {
741
+        $('#largeVideo').css({visibility:'visible'});
742
+        $('#watermark').css({visibility:'visible'});
743
+    }
744
+    else {
745
+        $('#largeVideo').css({visibility:'hidden'});
746
+        $('#watermark').css({visibility:'hidden'});
747
+    }
748
+}
749
+
858 750
 function getConferenceHandler() {
859 751
     return focus ? focus : activecall;
860 752
 }
@@ -876,6 +768,12 @@ function toggleVideo() {
876 768
             }
877 769
         );
878 770
     }
771
+    var sess = focus || activecall;
772
+    if (!sess) {
773
+        return;
774
+    }
775
+    sess.pendingop = ismuted ? 'unmute' : 'mute';
776
+    sess.modifySources();
879 777
 }
880 778
 
881 779
 function toggleAudio() {
@@ -886,47 +784,140 @@ function toggleAudio() {
886 784
     }
887 785
 }
888 786
 
889
-var resizeLarge = function () {
890
-    Chat.resizeChat();
891
-    var availableHeight = window.innerHeight;
892
-    var chatspaceWidth = $('#chatspace').is(":visible")
893
-                            ? $('#chatspace').width()
894
-                            : 0;
787
+/**
788
+ * Positions the large video.
789
+ *
790
+ * @param videoWidth the stream video width
791
+ * @param videoHeight the stream video height
792
+ */
793
+var positionLarge = function(videoWidth, videoHeight) {
794
+    var videoSpaceWidth = $('#videospace').width();
795
+    var videoSpaceHeight = window.innerHeight;
796
+
797
+    var videoSize = getVideoSize(   videoWidth,
798
+                                    videoHeight,
799
+                                    videoSpaceWidth,
800
+                                    videoSpaceHeight);
801
+
802
+    var availableWidth = videoSize[0];
803
+    var availableHeight = videoSize[1];
804
+
805
+    var videoPosition = getVideoPosition(   availableWidth,
806
+                                            availableHeight,
807
+                                            videoSpaceWidth,
808
+                                            videoSpaceHeight);
809
+
810
+    var horizontalIndent = videoPosition[0];
811
+    var verticalIndent = videoPosition[1];
812
+
813
+    positionVideo(  $('#largeVideo'),
814
+                    availableWidth,
815
+                    availableHeight,
816
+                    horizontalIndent, verticalIndent);
817
+};
895 818
 
896
-    var numvids = $('#remoteVideos>video:visible').length;
897
-    if (numvids < 5)
898
-        availableHeight -= 100; // min thumbnail height for up to 4 videos
899
-    else
900
-        availableHeight -= 50; // min thumbnail height for more than 5 videos
819
+/**
820
+ * Returns an array of the video horizontal and vertical indents,
821
+ * so that if fits its parent.
822
+ *
823
+ * @return an array with 2 elements, the horizontal indent and the vertical
824
+ * indent
825
+ */
826
+var getVideoPosition = function (   videoWidth,
827
+                                    videoHeight,
828
+                                    videoSpaceWidth,
829
+                                    videoSpaceHeight) {
830
+    // Parent height isn't completely calculated when we position the video in
831
+    // full screen mode and this is why we use the screen height in this case.
832
+    // Need to think it further at some point and implement it properly.
833
+    var isFullScreen = document.fullScreen
834
+                        || document.mozFullScreen
835
+                        || document.webkitIsFullScreen; 
836
+    if (isFullScreen)
837
+        videoSpaceHeight = window.innerHeight;
838
+
839
+    var horizontalIndent = (videoSpaceWidth - videoWidth)/2;
840
+    var verticalIndent = (videoSpaceHeight - videoHeight)/2;
841
+
842
+    return [horizontalIndent, verticalIndent];
843
+};
901 844
 
902
-    availableHeight -= 79; // padding + link ontop
903
-    var availableWidth = window.innerWidth - chatspaceWidth;
904
-    var aspectRatio = 16.0 / 9.0;
905
-    if (availableHeight < availableWidth / aspectRatio) {
906
-        availableWidth = Math.floor(availableHeight * aspectRatio);
845
+/**
846
+ * Returns an array of the video dimensions, so that if fits the screen.
847
+ *
848
+ * @return an array with 2 elements, the video width and the video height
849
+ */
850
+var getVideoSize = function(videoWidth,
851
+                            videoHeight,
852
+                            videoSpaceWidth,
853
+                            videoSpaceHeight) {
854
+    if (!videoWidth)
855
+        videoWidth = currentVideoWidth;
856
+    if (!videoHeight)
857
+        videoHeight = currentVideoHeight;
858
+
859
+    var aspectRatio = videoWidth / videoHeight;
860
+
861
+    var availableWidth = Math.max(videoWidth, videoSpaceWidth);
862
+    var availableHeight = Math.max(videoHeight, videoSpaceHeight);
863
+
864
+    if (availableWidth / aspectRatio < videoSpaceHeight) {
865
+        availableHeight = videoSpaceHeight;
866
+        availableWidth = availableHeight*aspectRatio;
907 867
     }
908
-    if (availableWidth < 0 || availableHeight < 0) return;
909
-    $('#largeVideo').parent().width(availableWidth);
910
-    $('#largeVideo').parent().height(availableWidth / aspectRatio);
911 868
 
912
-    if ($('#presentation>iframe')) {
913
-        $('#presentation>iframe').width(availableWidth);
914
-        $('#presentation>iframe').height(availableWidth / aspectRatio);
869
+    if (availableHeight*aspectRatio < videoSpaceWidth) {
870
+        availableWidth = videoSpaceWidth;
871
+        availableHeight = availableWidth / aspectRatio;
915 872
     }
916 873
 
917
-    if ($('#etherpad>iframe')) {
918
-        $('#etherpad>iframe').width(availableWidth);
919
-        $('#etherpad>iframe').height(availableWidth / aspectRatio);
920
-    }
874
+    return [availableWidth, availableHeight];
875
+};
876
+
877
+/**
878
+ * Sets the size and position of the given video element.
879
+ *
880
+ * @param video the video element to position
881
+ * @param width the desired video width
882
+ * @param height the desired video height
883
+ * @param horizontalIndent the left and right indent
884
+ * @param verticalIndent the top and bottom indent
885
+ */
886
+function positionVideo( video,
887
+                        width,
888
+                        height,
889
+                        horizontalIndent,
890
+                        verticalIndent) {
891
+    video.width(width);
892
+    video.height(height);
893
+    video.css({  top: verticalIndent + 'px',
894
+                 bottom: verticalIndent + 'px',
895
+                 left: horizontalIndent + 'px',
896
+                 right: horizontalIndent + 'px'});
897
+}
898
+
899
+var resizeLargeVideoContainer = function () {
900
+    Chat.resizeChat();
901
+    var availableHeight = window.innerHeight;
902
+    var availableWidth = Util.getAvailableVideoWidth();
903
+
904
+    if (availableWidth < 0 || availableHeight < 0) return;
905
+
906
+    $('#videospace').width(availableWidth);
907
+    $('#videospace').height(availableHeight);
908
+    $('#largeVideoContainer').width(availableWidth);
909
+    $('#largeVideoContainer').height(availableHeight);
921 910
 
922 911
     resizeThumbnails();
923 912
 };
924 913
 
925 914
 function resizeThumbnails() {
926
-    // Calculate the available height, which is the inner window height minus 39px for the header
927
-    // minus 2px for the delimiter lines on the top and bottom of the large video,
928
-    // minus the 36px space inside the remoteVideos container used for highlighting shadow.
929
-    var availableHeight = window.innerHeight - $('#largeVideo').height() - 59;
915
+    // Calculate the available height, which is the inner window height minus
916
+    // 39px for the header minus 2px for the delimiter lines on the top and
917
+    // bottom of the large video, minus the 36px space inside the remoteVideos
918
+    // container used for highlighting shadow.
919
+    var availableHeight = 100;
920
+
930 921
     var numvids = $('#remoteVideos>span:visible').length;
931 922
 
932 923
     // Remove the 1px borders arround videos and the chat width.
@@ -951,9 +942,10 @@ $(document).ready(function () {
951 942
     // Set the defaults for prompt dialogs.
952 943
     jQuery.prompt.setDefaults({persistent: false});
953 944
 
954
-    resizeLarge();
945
+    resizeLargeVideoContainer();
955 946
     $(window).resize(function () {
956
-        resizeLarge();
947
+        resizeLargeVideoContainer();
948
+        positionLarge();
957 949
     });
958 950
     if (!$('#settings').is(':visible')) {
959 951
         console.log('init');
@@ -1035,14 +1027,14 @@ function dump(elem, filename){
1035 1027
     return false;
1036 1028
 }
1037 1029
 
1038
-/*
1030
+/**
1039 1031
  * Changes the style class of the element given by id.
1040 1032
  */
1041 1033
 function buttonClick(id, classname) {
1042 1034
     $(id).toggleClass(classname); // add the class to the clicked element
1043 1035
 }
1044 1036
 
1045
-/*
1037
+/**
1046 1038
  * Opens the lock room dialog.
1047 1039
  */
1048 1040
 function openLockDialog() {
@@ -1103,7 +1095,7 @@ function openLockDialog() {
1103 1095
     }
1104 1096
 }
1105 1097
 
1106
-/*
1098
+/**
1107 1099
  * Opens the invite link dialog.
1108 1100
  */
1109 1101
 function openLinkDialog() {
@@ -1119,7 +1111,7 @@ function openLinkDialog() {
1119 1111
              });
1120 1112
 }
1121 1113
 
1122
-/*
1114
+/**
1123 1115
  * Opens the settings dialog.
1124 1116
  */
1125 1117
 function openSettingsDialog() {
@@ -1160,110 +1152,7 @@ function openSettingsDialog() {
1160 1152
              });
1161 1153
 }
1162 1154
 
1163
-/*
1164
- * Opens the Prezi dialog, from which the user could choose a presentation to load.
1165
- */
1166
-function openPreziDialog() {
1167
-    var myprezi = connection.emuc.getPrezi(connection.emuc.myroomjid);
1168
-    if (myprezi) {
1169
-        $.prompt("Are you sure you would like to remove your Prezi?",
1170
-                {
1171
-                title: "Remove Prezi",
1172
-                buttons: { "Remove": true, "Cancel": false},
1173
-                defaultButton: 1,
1174
-                submit: function(e,v,m,f){
1175
-                if(v)
1176
-                {
1177
-                    connection.emuc.removePreziFromPresence();
1178
-                    connection.emuc.sendPresence();
1179
-                }
1180
-            }
1181
-        });
1182
-    }
1183
-    else if (preziPlayer !== null) {
1184
-        $.prompt("Another participant is already sharing a Prezi." +
1185
-                "This conference allows only one Prezi at a time.",
1186
-                 {
1187
-                 title: "Share a Prezi",
1188
-                 buttons: { "Ok": true},
1189
-                 defaultButton: 0,
1190
-                 submit: function(e,v,m,f){
1191
-                    $.prompt.close();
1192
-                 }
1193
-                 });
1194
-    }
1195
-    else {
1196
-        var openPreziState = {
1197
-        state0: {
1198
-            html:   '<h2>Share a Prezi</h2>' +
1199
-                    '<input id="preziUrl" type="text" placeholder="e.g. http://prezi.com/wz7vhjycl7e6/my-prezi" autofocus>',
1200
-            persistent: false,
1201
-            buttons: { "Share": true , "Cancel": false},
1202
-            defaultButton: 1,
1203
-            submit: function(e,v,m,f){
1204
-                e.preventDefault();
1205
-                if(v)
1206
-                {
1207
-                    var preziUrl = document.getElementById('preziUrl');
1208
-
1209
-                    if (preziUrl.value)
1210
-                    {
1211
-                        var urlValue
1212
-                            = encodeURI(Util.escapeHtml(preziUrl.value));
1213
-
1214
-                        if (urlValue.indexOf('http://prezi.com/') !== 0
1215
-                            && urlValue.indexOf('https://prezi.com/') !== 0)
1216
-                        {
1217
-                            $.prompt.goToState('state1');
1218
-                            return false;
1219
-                        }
1220
-                        else {
1221
-                            var presIdTmp = urlValue.substring(urlValue.indexOf("prezi.com/") + 10);
1222
-                            if (!Util.isAlphanumeric(presIdTmp)
1223
-                                    || presIdTmp.indexOf('/') < 2) {
1224
-                                $.prompt.goToState('state1');
1225
-                                return false;
1226
-                            }
1227
-                            else {
1228
-                                connection.emuc.addPreziToPresence(urlValue, 0);
1229
-                                connection.emuc.sendPresence();
1230
-                                $.prompt.close();
1231
-                            }
1232
-                        }
1233
-                    }
1234
-                }
1235
-                else
1236
-                    $.prompt.close();
1237
-            }
1238
-        },
1239
-        state1: {
1240
-            html:   '<h2>Share a Prezi</h2>' +
1241
-                    'Please provide a correct prezi link.',
1242
-            persistent: false,
1243
-            buttons: { "Back": true, "Cancel": false },
1244
-            defaultButton: 1,
1245
-            submit:function(e,v,m,f) {
1246
-                e.preventDefault();
1247
-                if (v === 0)
1248
-                    $.prompt.close();
1249
-                else
1250
-                    $.prompt.goToState('state0');
1251
-            }
1252
-        }
1253
-        };
1254
-
1255
-        var myPrompt = jQuery.prompt(openPreziState);
1256
-
1257
-        myPrompt.on('impromptu:loaded', function(e) {
1258
-                    document.getElementById('preziUrl').focus();
1259
-                    });
1260
-        myPrompt.on('impromptu:statechanged', function(e) {
1261
-                    document.getElementById('preziUrl').focus();
1262
-                    });
1263
-    }
1264
-}
1265
-
1266
-/*
1155
+/**
1267 1156
  * Locks / unlocks the room.
1268 1157
  */
1269 1158
 function lockRoom(lock) {
@@ -1275,26 +1164,59 @@ function lockRoom(lock) {
1275 1164
     updateLockButton();
1276 1165
 }
1277 1166
 
1278
-/*
1167
+/**
1279 1168
  * Sets the shared key.
1280 1169
  */
1281 1170
 function setSharedKey(sKey) {
1282 1171
     sharedKey = sKey;
1283 1172
 }
1284 1173
 
1285
-/*
1174
+/**
1286 1175
  * Updates the lock button state.
1287 1176
  */
1288 1177
 function updateLockButton() {
1289
-    buttonClick("#lockIcon", "fa fa-unlock fa-lg fa fa-lock fa-lg");
1178
+    buttonClick("#lockIcon", "icon-security icon-security-locked");
1290 1179
 }
1291 1180
 
1292
-/*
1181
+/**
1182
+ * Hides the toolbar.
1183
+ */
1184
+var hideToolbar = function() {
1185
+
1186
+    var isToolbarHover = false;
1187
+    $('#header').find('*').each(function(){
1188
+        var id = $(this).attr('id');
1189
+        if ($("#" + id + ":hover").length > 0) {
1190
+            isToolbarHover = true;
1191
+        }
1192
+    });
1193
+
1194
+    clearTimeout(toolbarTimeout);
1195
+    toolbarTimeout = null;
1196
+
1197
+    if (!isToolbarHover) {
1198
+        $('#header').hide("slide", { direction: "up", duration: 300});
1199
+    }
1200
+    else {
1201
+        toolbarTimeout = setTimeout(hideToolbar, 2000);
1202
+    }
1203
+};
1204
+
1205
+/**
1293 1206
  * Shows the call main toolbar.
1294 1207
  */
1295 1208
 function showToolbar() {
1296
-    $('#toolbar').css({visibility:"visible"});
1297
-    if (focus !== null)
1209
+    if (!$('#header').is(':visible')) {
1210
+        $('#header').show("slide", { direction: "up", duration: 300});
1211
+
1212
+        if (toolbarTimeout) {
1213
+            clearTimeout(toolbarTimeout);
1214
+            toolbarTimeout = null;
1215
+        }
1216
+        toolbarTimeout = setTimeout(hideToolbar, 2000);
1217
+    }
1218
+
1219
+    if (focus != null)
1298 1220
     {
1299 1221
 //        TODO: Enable settings functionality. Need to uncomment the settings button in index.html.
1300 1222
 //        $('#settingsButton').css({visibility:"visible"});
@@ -1303,14 +1225,39 @@ function showToolbar() {
1303 1225
     setDesktopSharing(config.desktopSharing);
1304 1226
 }
1305 1227
 
1306
-/*
1228
+/**
1229
+ * Docks/undocks the toolbar.
1230
+ *
1231
+ * @param isDock indicates what operation to perform
1232
+ */
1233
+function dockToolbar(isDock) {
1234
+    if (isDock) {
1235
+        // First make sure the toolbar is shown.
1236
+        if (!$('#header').is(':visible')) {
1237
+            showToolbar();
1238
+        }
1239
+        // Then clear the time out, to dock the toolbar.
1240
+        clearTimeout(toolbarTimeout);
1241
+        toolbarTimeout = null;
1242
+    }
1243
+    else {
1244
+        if (!$('#header').is(':visible')) {
1245
+            showToolbar();
1246
+        }
1247
+        else {
1248
+            toolbarTimeout = setTimeout(hideToolbar, 2000);
1249
+        }
1250
+    }
1251
+}
1252
+
1253
+/**
1307 1254
  * Updates the room invite url.
1308 1255
  */
1309 1256
 function updateRoomUrl(newRoomUrl) {
1310 1257
     roomUrl = newRoomUrl;
1311 1258
 }
1312 1259
 
1313
-/*
1260
+/**
1314 1261
  * Warning to the user that the conference window is about to be closed.
1315 1262
  */
1316 1263
 function closePageWarning() {
@@ -1320,7 +1267,7 @@ function closePageWarning() {
1320 1267
         return "You are about to leave this conversation.";
1321 1268
 }
1322 1269
 
1323
-/*
1270
+/**
1324 1271
  * Shows a visual indicator for the focus of the conference.
1325 1272
  * Currently if we're not the owner of the conference we obtain the focus
1326 1273
  * from the connection.jingle.sessions.
@@ -1385,21 +1332,17 @@ function toggleFullScreen() {
1385 1332
 
1386 1333
         //Enter Full Screen
1387 1334
         if (fsElement.mozRequestFullScreen) {
1388
-
1389 1335
             fsElement.mozRequestFullScreen();
1390 1336
         }
1391 1337
         else {
1392 1338
             fsElement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
1393 1339
         }
1394
-
1395 1340
     } else {
1396
-
1397 1341
         //Exit Full Screen
1398 1342
         if (document.mozCancelFullScreen) {
1399 1343
             document.mozCancelFullScreen();
1400 1344
         } else {
1401 1345
             document.webkitCancelFullScreen();
1402
-            document.webkitCancelFullScreen();
1403 1346
         }
1404 1347
     }
1405 1348
 }
@@ -1493,6 +1436,11 @@ function showDisplayName(videoSpanId, displayName) {
1493 1436
     }
1494 1437
 }
1495 1438
 
1439
+/**
1440
+ * Creates the edit display name button.
1441
+ * 
1442
+ * @returns the edit button
1443
+ */
1496 1444
 function createEditDisplayNameButton() {
1497 1445
     var editButton = document.createElement('a');
1498 1446
     editButton.className = 'displayname';
@@ -1500,3 +1448,36 @@ function createEditDisplayNameButton() {
1500 1448
 
1501 1449
     return editButton;
1502 1450
 }
1451
+
1452
+/**
1453
+ * Resizes and repositions videos in full screen mode.
1454
+ */
1455
+$(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange',
1456
+        function() {
1457
+            resizeLargeVideoContainer();
1458
+            positionLarge();
1459
+            isFullScreen = document.fullScreen
1460
+                                || document.mozFullScreen
1461
+                                || document.webkitIsFullScreen;
1462
+
1463
+            if (isFullScreen) {
1464
+                setView("fullscreen");
1465
+            }
1466
+            else {
1467
+                setView("default");
1468
+            }
1469
+});
1470
+
1471
+/**
1472
+ * Sets the current view.
1473
+ */
1474
+function setView(viewName) {
1475
+//    if (viewName == "fullscreen") {
1476
+//        document.getElementById('videolayout_fullscreen').disabled  = false;
1477
+//        document.getElementById('videolayout_default').disabled  = true;
1478
+//    }
1479
+//    else {
1480
+//        document.getElementById('videolayout_default').disabled  = false;
1481
+//        document.getElementById('videolayout_fullscreen').disabled  = true;
1482
+//    }
1483
+}

+ 92
- 25
chat.js Parādīt failu

@@ -96,31 +96,78 @@ var Chat = (function (my) {
96 96
         var chatspace = $('#chatspace');
97 97
         var videospace = $('#videospace');
98 98
 
99
-        var onShow = function () {
100
-            resizeLarge();
101
-            $('#chatspace').show("slide", { direction: "right", duration: 500});
102
-        };
103
-        var onHide = function () {
104
-            $('#chatspace').hide("slide", { direction: "right", duration: 500});
105
-            resizeLarge();
106
-        };
99
+        var chatSize = (chatspace.is(":visible")) ? [0, 0] : Chat.getChatSize();
100
+        var videospaceWidth = window.innerWidth - chatSize[0];
101
+        var videospaceHeight = window.innerHeight;
102
+        var videoSize
103
+            = getVideoSize(null, null, videospaceWidth, videospaceHeight);
104
+        var videoWidth = videoSize[0];
105
+        var videoHeight = videoSize[1];
106
+        var videoPosition = getVideoPosition(   videoWidth,
107
+                                                videoHeight,
108
+                                                videospaceWidth,
109
+                                                videospaceHeight);
110
+        var horizontalIndent = videoPosition[0];
111
+        var verticalIndent = videoPosition[1];
107 112
 
108 113
         if (chatspace.is(":visible")) {
109
-            videospace.animate( {right: 0},
114
+            videospace.animate( {right: chatSize[0],
115
+                                width: videospaceWidth,
116
+                                height: videospaceHeight},
110 117
                                 {queue: false,
111
-                                duration: 500,
112
-                                progress: onHide});
118
+                                duration: 500});
119
+
120
+            $('#largeVideoContainer').animate({ width: videospaceWidth,
121
+                                                height: videospaceHeight},
122
+                                                {queue: false,
123
+                                                 duration: 500
124
+                                                });
125
+
126
+            $('#largeVideo').animate({  width: videoWidth,
127
+                                        height: videoHeight,
128
+                                        top: verticalIndent,
129
+                                        bottom: verticalIndent,
130
+                                        left: horizontalIndent,
131
+                                        right: horizontalIndent},
132
+                                        {   queue: false,
133
+                                            duration: 500
134
+                                        });
135
+
136
+            $('#chatspace').hide("slide", { direction: "right",
137
+                                            queue: false,
138
+                                            duration: 500});
113 139
         }
114 140
         else {
115
-            videospace.animate({right: chatspace.width()},
141
+            videospace.animate({right: chatSize[0],
142
+                                width: videospaceWidth,
143
+                                height: videospaceHeight},
116 144
                                {queue: false,
117 145
                                 duration: 500,
118
-                                progress: onShow,
119 146
                                 complete: function() {
120 147
                                     scrollChatToBottom();
121 148
                                     chatspace.trigger('shown');
122 149
                                 }
123 150
                                });
151
+
152
+            $('#largeVideoContainer').animate({ width: videospaceWidth,
153
+                                                height: videospaceHeight},
154
+                                                {queue: false,
155
+                                                 duration: 500
156
+                                                });
157
+
158
+            $('#largeVideo').animate({  width: videoWidth,
159
+                                        height: videoHeight,
160
+                                        top: verticalIndent,
161
+                                        bottom: verticalIndent,
162
+                                        left: horizontalIndent,
163
+                                        right: horizontalIndent},
164
+                                        {queue: false,
165
+                                         duration: 500
166
+                                        });
167
+
168
+            $('#chatspace').show("slide", { direction: "right",
169
+                                            queue: false,
170
+                                            duration: 500});
124 171
         }
125 172
 
126 173
         // Request the focus in the nickname field or the chat input field.
@@ -147,6 +194,18 @@ var Chat = (function (my) {
147 194
      * Resizes the chat area.
148 195
      */
149 196
     my.resizeChat = function () {
197
+        var chatSize = Chat.getChatSize();
198
+
199
+        $('#chatspace').width(chatSize[0]);
200
+        $('#chatspace').height(chatSize[1]);
201
+
202
+        resizeChatConversation();
203
+    };
204
+
205
+    /**
206
+     * Returns the size of the chat.
207
+     */
208
+    my.getChatSize = function() {
150 209
         var availableHeight = window.innerHeight;
151 210
         var availableWidth = window.innerWidth;
152 211
 
@@ -154,10 +213,7 @@ var Chat = (function (my) {
154 213
         if (availableWidth*0.2 < 200)
155 214
             chatWidth = availableWidth*0.2;
156 215
 
157
-        $('#chatspace').width(chatWidth);
158
-        $('#chatspace').height(availableHeight - 40);
159
-
160
-        resizeChatConversation();
216
+        return [chatWidth, availableHeight];
161 217
     };
162 218
 
163 219
     /**
@@ -168,10 +224,11 @@ var Chat = (function (my) {
168 224
         var usermsgHeight = usermsgStyleHeight
169 225
             .substring(0, usermsgStyleHeight.indexOf('px'));
170 226
 
227
+        $('#usermsg').width($('#chatspace').width() - 10);
171 228
         $('#chatconversation').width($('#chatspace').width() - 10);
172 229
         $('#chatconversation')
173
-            .height(window.innerHeight - 50 - parseInt(usermsgHeight));
174
-    }
230
+            .height(window.innerHeight - 10 - parseInt(usermsgHeight));
231
+    };
175 232
 
176 233
     /**
177 234
      * Shows/hides a visual notification, indicating that a message has arrived.
@@ -179,25 +236,35 @@ var Chat = (function (my) {
179 236
     function setVisualNotification(show) {
180 237
         var unreadMsgElement = document.getElementById('unreadMessages');
181 238
 
239
+        var glower = $('#chatButton');
240
+
182 241
         if (unreadMessages) {
183 242
             unreadMsgElement.innerHTML = unreadMessages.toString();
184 243
 
244
+            showToolbar();
245
+
185 246
             var chatButtonElement
186
-                = document.getElementById('chat').parentNode;
247
+                = document.getElementById('chatButton').parentNode;
187 248
             var leftIndent = (Util.getTextWidth(chatButtonElement)
188
-                                - Util.getTextWidth(unreadMsgElement) - 5)/2;
249
+                                - Util.getTextWidth(unreadMsgElement))/2;
189 250
             var topIndent = (Util.getTextHeight(chatButtonElement)
190
-                                - Util.getTextHeight(unreadMsgElement))/2 - 2;
251
+                                - Util.getTextHeight(unreadMsgElement))/2 - 3;
191 252
 
192 253
             unreadMsgElement.setAttribute(
193 254
                     'style',
194 255
                     'top:' + topIndent
195 256
                      + '; left:' + leftIndent +';');
257
+
258
+            if (!glower.hasClass('icon-chat-simple')) {
259
+                glower.removeClass('icon-chat');
260
+                glower.addClass('icon-chat-simple');
261
+            }
196 262
         }
197
-        else
263
+        else {
198 264
             unreadMsgElement.innerHTML = '';
199
-
200
-        var glower = $('#chat');
265
+            glower.removeClass('icon-chat-simple');
266
+            glower.addClass('icon-chat');
267
+        }
201 268
 
202 269
         if (show && !notificationInterval) {
203 270
             notificationInterval = window.setInterval(function() {

+ 71
- 0
css/font.css Parādīt failu

@@ -0,0 +1,71 @@
1
+@font-face {
2
+    font-family: 'jitsi';
3
+    src:url('../fonts/jitsi.eot?94d075');
4
+    src:url('../fonts/jitsi.eot?#iefix94d075') format('embedded-opentype'),
5
+        url('../fonts/jitsi.woff?94d075') format('woff'),
6
+        url('../fonts/jitsi.ttf?94d075') format('truetype'),
7
+        url('../fonts/jitsi.svg?94d075#jitsi') format('svg');
8
+    font-weight: normal;
9
+    font-style: normal;
10
+}
11
+
12
+[class^="icon-"], [class*=" icon-"] {
13
+    font-family: 'jitsi';
14
+    speak: none;
15
+    font-style: normal;
16
+    font-weight: normal;
17
+    font-variant: normal;
18
+    text-transform: none;
19
+    line-height: 0.75em;
20
+    font-size: 1.22em;
21
+
22
+    /* Better Font Rendering =========== */
23
+    -webkit-font-smoothing: antialiased;
24
+    -moz-osx-font-smoothing: grayscale;
25
+}
26
+
27
+.icon-share-desktop:before {
28
+	content: "\e602";
29
+}
30
+.icon-chat-simple:before {
31
+	content: "\e606";
32
+}
33
+.icon-full-screen:before {
34
+	content: "\e60d";
35
+}
36
+.icon-exit-full-screen:before {
37
+	content: "\e60e";
38
+}
39
+.icon-prezi:before {
40
+	content: "\e60c";
41
+}
42
+.icon-link:before {
43
+	content: "\e600";
44
+}
45
+.icon-chat:before {
46
+	content: "\e601";
47
+}
48
+.icon-presentation:before {
49
+	content: "\e603";
50
+}
51
+.icon-security:before {
52
+	content: "\e604";
53
+}
54
+.icon-share-doc:before {
55
+	content: "\e605";
56
+}
57
+.icon-security-locked:before {
58
+	content: "\e607";
59
+}
60
+.icon-camera:before {
61
+	content: "\e608";
62
+}
63
+.icon-camera-disabled:before {
64
+	content: "\e609";
65
+}
66
+.icon-mic-disabled:before {
67
+	content: "\e60a";
68
+}
69
+.icon-microphone:before {
70
+	content: "\e60b";
71
+}

+ 11
- 239
css/main.css Parādīt failu

@@ -4,99 +4,15 @@ html, body{
4 4
     color: #424242;
5 5
     font-family:'Helvetica Neue', Helvetica, sans-serif;
6 6
     font-weight: 400;
7
-    background: #e9e9e9;
7
+    background: #000000;
8 8
     overflow-x: hidden;
9 9
 }
10 10
 
11
-#videospace {
12
-    display: block;
13
-    position: absolute;
14
-    top: 39px;
15
-    left: 0px;
16
-    right: 0px;
17
-    float: left;
18
-}
19
-
20
-.videocontainer {
21
-    position: relative;
22
-    margin-left: auto;
23
-    margin-right: auto;
24
-}
25
-#presentation, #etherpad, .videocontainer>video {
26
-    position: absolute;
27
-    left: 0px;
28
-    top: 0px;
29
-    z-index: 1;
30
-    width: 100%;
31
-    height: 100%;
32
-}
33
-
34
-#etherpad {
35
-    z-index: 0;
36
-}
37
-
38
-#etherpadButton {
39
-    display: none;
40
-}
41
-
42
-.videocontainer>span {
43
-    display: none; /* enable when you want nicks to be shown */
44
-    position: absolute;
45
-    left: 0px;
46
-    bottom: -20px;
47
-    z-index: 0;
48
-    width: 100%;
49
-    font-size: 10pt;
50
-}
51
-
52
-.flipVideoX {
53
-    -moz-transform: scaleX(-1);
54
-    -webkit-transform: scaleX(-1);
55
-    -o-transform: scaleX(-1);
56
-    transform: scaleX(-1);
57
-}
58
-
59
-#remoteVideos {
60
-    display:block;
61
-    position:relative;
62
-    text-align:center;
63
-    height:196px;
64
-    padding: 5px 0px;
65
-    width:auto;
66
-    overflow: hidden;
67
-    border:1px solid transparent;
68
-    z-index: 2;
69
-}
70
-
71
-#remoteVideos>span {
72
-    display: inline-block;
73
-    z-index:0;
74
-    border:1px solid #FFFFFF;
75
-    background-image:url(../images/avatar1.png);
76
-    background-size: contain;
77
-}
78
-
79
-#remoteVideos>span:hover {
80
-    cursor: pointer;
81
-    cursor: hand;
82
-    transform:scale(1.08, 1.08);
83
-    -webkit-transform:scale(1.08, 1.08);
84
-    transition-duration: 0.5s;
85
-    -webkit-transition-duration: 0.5s;
86
-    background-color: #FFFFFF;
87
-    -webkit-animation-name: greyPulse;
88
-    -webkit-animation-duration: 2s;
89
-    -webkit-animation-iteration-count: 1;
90
-    -webkit-box-shadow: 0 0 18px #515151;
91
-    border:1px solid #FFFFFF;
92
-    z-index: 10;
93
-}
94
-
95 11
 #chatspace {
96 12
     display:none;
97 13
     position:absolute;
98 14
     float: right;
99
-    top: 40px;
15
+    top: 0px;
100 16
     bottom: 0px;
101 17
     right: 0px;
102 18
     width: 20%;
@@ -105,9 +21,11 @@ html, body{
105 21
     /* background-color:#dfebf1;*/
106 22
     background-color:#FFFFFF;
107 23
     border-left:1px solid #424242;
24
+    z-index: 5;
108 25
 }
109 26
 
110 27
 #chatconversation {
28
+    visibility: hidden;
111 29
     position: relative;
112 30
     top: 5px;
113 31
     padding: 5px;
@@ -119,7 +37,6 @@ html, body{
119 37
     overflow-y: scroll;
120 38
     overflow-x: hidden;
121 39
     word-wrap: break-word;
122
-    visibility: hidden;
123 40
 }
124 41
 
125 42
 .localuser {
@@ -131,20 +48,20 @@ html, body{
131 48
 }
132 49
 
133 50
 #usermsg {
51
+    visibility:hidden;
134 52
     position: relative;
135 53
     width: 100%;
136 54
     height: 5%;
137 55
     padding: 5px;
138
-    z-index: 5;
139 56
     max-height:150px;
140 57
     min-height:50px;
141
-    visibility:hidden;
142 58
     border: 0px none;
143 59
     border-top: 1px solid #cccccc;
144 60
     background: #FFFFFF;
145 61
     box-shadow: none;
146 62
     border-radius:0;
147 63
     font-size: 10pt;
64
+    overflow: hidden;
148 65
 }
149 66
 
150 67
 #usermsg: hover {
@@ -169,10 +86,6 @@ html, body{
169 86
     font-size: 14;
170 87
 }
171 88
 
172
-#spacer {
173
-    height:5px;
174
-}
175
-
176 89
 #settings {
177 90
     display:none;
178 91
 }
@@ -181,47 +94,6 @@ html, body{
181 94
     display:none;
182 95
 }
183 96
 
184
-#header{
185
-    display:block;
186
-    height:39px;
187
-    text-align:center;
188
-    background-color: #2591e5;
189
-}
190
-
191
-#left {
192
-    display:block;
193
-    position: absolute;
194
-    left: 0px;
195
-    top: 0px;
196
-    width: 100px;
197
-    height: 39px;
198
-    background-image:url(../images/left1.png);
199
-    background-repeat:no-repeat;
200
-    margin: 0;
201
-    padding: 0;
202
-}
203
-
204
-#leftlogo {
205
-    position:absolute;
206
-    top: 5px;
207
-    left: 15px;
208
-    background-image:url(../images/jitsilogo.png);
209
-    background-repeat:no-repeat;
210
-    height: 31px;
211
-    width: 68px;
212
-    z-index:1;
213
-}
214
-
215
-#toolbar {
216
-    display:block;
217
-    position:relative;
218
-    height:39px;
219
-    width:auto;
220
-    overflow: hidden;
221
-    z-index:0;
222
-    visibility: hidden;
223
-}
224
-
225 97
 #settingsButton {
226 98
     visibility: hidden;
227 99
 }
@@ -254,18 +126,16 @@ html, body{
254 126
     cursor: pointer;
255 127
 }
256 128
 
257
-#chat {
258
-    font-size:1.65em;
129
+#chatButton {
259 130
     -webkit-transition: all .5s ease-in-out;;
260 131
        -moz-transition: all .5s ease-in-out;;
261 132
             transition: all .5s ease-in-out;;
262 133
 }
263 134
 
264
-#chat.active {
135
+#chatButton.active {
265 136
     -webkit-text-shadow: 0 0 10px #ffffff;
266 137
     -moz-text-shadow: 0 0 10px #ffffff;
267 138
     text-shadow: 0 0 10px #ffffff;
268
-    /* -webkit-transform: scale(1.1); */
269 139
 }
270 140
 
271 141
 a.button:hover {
@@ -282,44 +152,13 @@ a.button:hover {
282 152
     color: #636363;
283 153
 }
284 154
 
285
-.fade_line {
286
-    height: 1px;
287
-    background: black;
288
-    background: -webkit-gradient(linear, 0 0, 100% 0, from(#e9e9e9), to(#e9e9e9), color-stop(50%, black));
289
-}
290
-
291 155
 .header_button_separator {
292 156
     display: inline-block;
293 157
     position:relative;
294
-    top: 7;
158
+    top: 5;
295 159
     width: 1px;
296
-    height: 25px;
297
-    background: white;
298
-    background: -webkit-gradient(linear, 0 0, 0 100%, from(#087dba), to(#087dba), color-stop(50%, white));
299
-}
300
-
301
-#right {
302
-    display:block;
303
-    position:absolute;
304
-    right: 0px;
305
-    top: 0px;
306
-    background-image:url(../images/right1.png);
307
-    background-repeat:no-repeat;
308
-    margin:0;
309
-    padding:0;
310
-    width:100px;
311
-    height:39px;
312
-}
313
-
314
-#rightlogo {
315
-    position:absolute;
316
-    top: 6px;
317
-    right: 15px;
318
-    background-image:url(../images/estoslogo.png);
319
-    background-repeat:no-repeat;
320
-    height: 25px;
321
-    width: 62px;
322
-    z-index:1;
160
+    height: 20px;
161
+    background: #676767;
323 162
 }
324 163
 
325 164
 input[type='text'], textarea {
@@ -387,70 +226,3 @@ form {
387 226
     overflow: visible;
388 227
     z-index: 100;
389 228
 }
390
-
391
-.videocontainer>span.focusindicator {
392
-    display: inline-block;
393
-    position: absolute;
394
-    color: #FFFFFF;
395
-    top: 0;
396
-    padding: 5px 0px;
397
-    width: 25px;
398
-    font-size: 11pt;
399
-    text-shadow: 0px 1px 0px rgba(255,255,255,.3), 0px -1px 0px rgba(0,0,0,.7);
400
-    border: 0px;
401
-    z-index: 2;
402
-}
403
-
404
-.videocontainer>span.displayname,
405
-.videocontainer>input.displayname {
406
-    display: inline-block;
407
-    position: absolute;
408
-    background: -webkit-linear-gradient(left, rgba(0,0,0,.7), rgba(0,0,0,0));
409
-    color: #b7b7b7;
410
-    bottom: 0;
411
-    left: 0;
412
-    padding: 3px 5px;
413
-    width: 100%;
414
-    height: auto;
415
-    max-height: 18px;
416
-    font-size: 9pt;
417
-    text-align: left;
418
-    text-overflow: ellipsis;
419
-    overflow: hidden;
420
-    white-space: nowrap;
421
-    z-index: 2;
422
-    box-sizing: border-box;
423
-}
424
-
425
-#localVideoContainer>span.displayname:hover {
426
-    cursor: text;
427
-}
428
-
429
-.videocontainer>a.displayname {
430
-    display: inline-block;
431
-    position: absolute;
432
-    color: #b7b7b7;
433
-    bottom: 0;
434
-    right: 0;
435
-    padding: 3px 5px;
436
-    font-size: 9pt;
437
-    cursor: pointer;
438
-    z-index: 2;
439
-}
440
-
441
-#reloadPresentation {
442
-    display: none;
443
-    position: absolute;
444
-    color: #FFFFFF;
445
-    top: 0;
446
-    right: 0;
447
-    padding: 10px 10px;
448
-    font-size: 11pt;
449
-    cursor: pointer;
450
-    background: rgba(0, 0, 0, 0.3);
451
-    border-radius: 5px;
452
-    background-clip: padding-box;
453
-    -webkit-border-radius: 5px;
454
-    -webkit-background-clip: padding-box;
455
-    z-index: 3;
456
-}

+ 226
- 0
css/videolayout_default.css Parādīt failu

@@ -0,0 +1,226 @@
1
+#videospace {
2
+    display: block;
3
+    position: absolute;
4
+    top: 0px;
5
+    left: 0px;
6
+    right: 0px;
7
+}
8
+
9
+#remoteVideos {
10
+    display:block;
11
+    position:absolute;
12
+    text-align:right;
13
+    height:196px;
14
+    padding: 18px;
15
+    bottom: 0;
16
+    left: 0;
17
+    right: 0;
18
+    width:auto;
19
+    overflow: hidden;
20
+    border:1px solid transparent;
21
+    z-index: 2;
22
+}
23
+
24
+.videocontainer {
25
+    position: relative;
26
+    margin-left: auto;
27
+    margin-right: auto;
28
+}
29
+
30
+#remoteVideos .videocontainer {
31
+    display: inline-block;
32
+    background-image:url(../images/avatar1.png);
33
+    background-size: contain;
34
+    border-radius:8px;
35
+    border: 2px solid #212425;
36
+}
37
+
38
+#remoteVideos .videocontainer:hover {
39
+    width: 100%;
40
+    height: 100%;
41
+    content:"";
42
+    cursor: pointer;
43
+    cursor: hand;
44
+    transform:scale(1.08, 1.08);
45
+    -webkit-transform:scale(1.08, 1.08);
46
+    transition-duration: 0.5s;
47
+    -webkit-transition-duration: 0.5s;
48
+    -webkit-animation-name: greyPulse;
49
+    -webkit-animation-duration: 2s;
50
+    -webkit-animation-iteration-count: 1;
51
+    -webkit-box-shadow: 0 0 18px #388396;
52
+    border: 2px solid #388396;
53
+    z-index: 3;
54
+}
55
+
56
+#localVideoWrapper {
57
+    display:inline-block;
58
+    -webkit-mask-box-image: url(http://emcho.com/db/videomask.svg);
59
+    border-radius:0px !important;
60
+    border: 0px !important;
61
+}
62
+
63
+#remoteVideos .videocontainer>video {
64
+    border-radius:6px;
65
+}
66
+
67
+.flipVideoX {
68
+    transform: scale(-1, 1);
69
+    -moz-transform: scale(-1, 1);
70
+    -webkit-transform: scale(-1, 1);
71
+    -o-transform: scale(-1, 1);
72
+}
73
+
74
+#localVideoWrapper>video {
75
+    border-radius:0px !important;
76
+}
77
+
78
+#largeVideo,
79
+#largeVideoContainer {
80
+    overflow: hidden;
81
+    text-align: center;
82
+}
83
+
84
+#presentation,
85
+#etherpad,
86
+#localVideoWrapper>video,
87
+#localVideoWrapper,
88
+.videocontainer>video {
89
+    position: absolute;
90
+    left: 0;
91
+    top: 0;
92
+    z-index: 1;
93
+    width: 100%;
94
+    height: 100%;
95
+}
96
+
97
+#etherpad,
98
+#presentation {
99
+    text-align: center;
100
+}
101
+
102
+#etherpad {
103
+    z-index: 0;
104
+}
105
+
106
+#etherpadButton {
107
+    display: none;
108
+}
109
+
110
+#remoteVideos .videocontainer>span.focusindicator {
111
+    display: inline-block;
112
+    position: absolute;
113
+    color: #FFFFFF;
114
+    top: 0;
115
+    left: 0;
116
+    padding: 5px 0px;
117
+    width: 25px;
118
+    font-size: 11pt;
119
+    text-shadow: 0px 1px 0px rgba(255,255,255,.3), 0px -1px 0px rgba(0,0,0,.7);
120
+    border: 0px;
121
+    z-index: 2;
122
+}
123
+
124
+#remoteVideos .nick {
125
+    display: none; /* enable when you want nicks to be shown */
126
+    position: absolute;
127
+    left: 0px;
128
+    bottom: -20px;
129
+    z-index: 0;
130
+    width: 100%;
131
+    font-size: 10pt;
132
+}
133
+
134
+.videocontainer>span.displayname,
135
+.videocontainer>input.displayname {
136
+    display: inline-block;
137
+    position: absolute;
138
+    background: -webkit-linear-gradient(left, rgba(0,0,0,.7), rgba(0,0,0,0));
139
+    color: #FFFFFF;
140
+    bottom: 0;
141
+    left: 0;
142
+    padding: 3px 5px;
143
+    width: 100%;
144
+    height: auto;
145
+    max-height: 18px;
146
+    font-size: 9pt;
147
+    text-align: left;
148
+    text-overflow: ellipsis;
149
+    overflow: hidden;
150
+    white-space: nowrap;
151
+    z-index: 2;
152
+    box-sizing: border-box;
153
+    border-bottom-left-radius:6px;
154
+    border-bottom-right-radius:6px;
155
+}
156
+
157
+#localVideoContainer>span.displayname:hover {
158
+    cursor: text;
159
+}
160
+
161
+.videocontainer>a.displayname {
162
+    display: inline-block;
163
+    position: absolute;
164
+    color: #FFFFFF;
165
+    bottom: 0;
166
+    right: 0;
167
+    padding: 3px 5px;
168
+    font-size: 9pt;
169
+    cursor: pointer;
170
+    z-index: 2;
171
+}
172
+
173
+#reloadPresentation {
174
+    display: none;
175
+    position: absolute;
176
+    color: #FFFFFF;
177
+    top: 0;
178
+    right:0;
179
+    padding: 10px 10px;
180
+    font-size: 11pt;
181
+    cursor: pointer;
182
+    background: rgba(0, 0, 0, 0.3);
183
+    border-radius: 5px;
184
+    background-clip: padding-box;
185
+    -webkit-border-radius: 5px;
186
+    -webkit-background-clip: padding-box;
187
+    z-index: 20; /*The reload button should appear on top of the header!*/
188
+}
189
+
190
+#header{
191
+    display:none;
192
+    position:absolute;
193
+    height:39px;
194
+    text-align:center;
195
+    top:0;
196
+    left:0;
197
+    right:0;
198
+    z-index:10;
199
+}
200
+
201
+#toolbar {
202
+    display:inline-block;
203
+    position:relative;
204
+    margin-left:auto;
205
+    margin-right:auto;
206
+    height:39px;
207
+    width:auto;
208
+    overflow: hidden;
209
+    background: linear-gradient(to bottom, rgba(103,103,103,.65) , rgba(0,0,0,.65));
210
+    -webkit-box-shadow: 0 0 2px #000000, 0 0 10px #000000;
211
+    border-bottom-left-radius: 12px;
212
+    border-bottom-right-radius: 12px;
213
+}
214
+
215
+#watermark {
216
+    display: block;
217
+    position: absolute;
218
+    left: 15;
219
+    top: 15;
220
+    width: 20%;
221
+    height: 10%;
222
+    background-image:url(../images/watermark.png);
223
+    background-size: contain;
224
+    background-repeat: no-repeat;
225
+    z-index: 2;
226
+}

+ 38
- 6
etherpad.js Parādīt failu

@@ -33,21 +33,23 @@ var Etherpad = (function (my) {
33 33
         if (!etherpadIFrame)
34 34
             createIFrame();
35 35
 
36
-        // TODO FIX large video and prezi toggling. Too many calls from different places.
37 36
         var largeVideo = null;
38
-        if (isPresentationVisible())
37
+        if (Prezi.isPresentationVisible())
39 38
             largeVideo = $('#presentation>iframe');
40 39
         else
41 40
             largeVideo = $('#largeVideo');
42 41
 
43 42
         if ($('#etherpad>iframe').css('visibility') === 'hidden') {
44 43
             largeVideo.fadeOut(300, function () {
45
-                if (isPresentationVisible())
44
+                if (Prezi.isPresentationVisible())
46 45
                     largeVideo.css({opacity:'0'});
47
-                else
48
-                    largeVideo.css({visibility:'hidden'});
46
+                else {
47
+                    setLargeVideoVisible(false);
48
+                    dockToolbar(true);
49
+                }
49 50
 
50 51
                 $('#etherpad>iframe').fadeIn(300, function() {
52
+                    document.body.style.background = '#eeeeee';
51 53
                     $('#etherpad>iframe').css({visibility:'visible'});
52 54
                     $('#etherpad').css({zIndex:2});
53 55
                 });
@@ -57,15 +59,38 @@ var Etherpad = (function (my) {
57 59
             $('#etherpad>iframe').fadeOut(300, function () {
58 60
                 $('#etherpad>iframe').css({visibility:'hidden'});
59 61
                 $('#etherpad').css({zIndex:0});
62
+                document.body.style.background = 'black';
60 63
                 if (!isPresentation) {
61 64
                     $('#largeVideo').fadeIn(300, function() {
62
-                        $('#largeVideo').css({visibility:'visible'});
65
+                        setLargeVideoVisible(true);
66
+                        dockToolbar(false);
63 67
                     });
64 68
                 }
65 69
             });
66 70
         }
71
+        resize();
67 72
     };
68 73
 
74
+    /**
75
+     * Resizes the etherpad.
76
+     */
77
+    function resize() {
78
+        if ($('#etherpad>iframe').length) {
79
+            var remoteVideos = $('#remoteVideos');
80
+            var availableHeight
81
+                = window.innerHeight - remoteVideos.outerHeight();
82
+            var availableWidth = Util.getAvailableVideoWidth();
83
+
84
+            var aspectRatio = 16.0 / 9.0;
85
+            if (availableHeight < availableWidth / aspectRatio) {
86
+                availableWidth = Math.floor(availableHeight * aspectRatio);
87
+            }
88
+
89
+            $('#etherpad>iframe').width(availableWidth);
90
+            $('#etherpad>iframe').height(availableHeight);
91
+        }
92
+    }
93
+
69 94
     /**
70 95
      * Shares the Etherpad name with other participants.
71 96
      */
@@ -127,5 +152,12 @@ var Etherpad = (function (my) {
127 152
             Etherpad.toggleEtherpad(isPresentation);
128 153
     });
129 154
 
155
+    /**
156
+     * Resizes the etherpad, when the window is resized.
157
+     */
158
+    $(window).resize(function () {
159
+        resize();
160
+    });
161
+
130 162
     return my;
131 163
 }(Etherpad || {}));

Binārs
fonts/jitsi.eot Parādīt failu


+ 25
- 0
fonts/jitsi.svg Parādīt failu

@@ -0,0 +1,25 @@
1
+<?xml version="1.0" standalone="no"?>
2
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+<svg xmlns="http://www.w3.org/2000/svg">
4
+<metadata>Generated by IcoMoon</metadata>
5
+<defs>
6
+<font id="jitsi" horiz-adv-x="512">
7
+<font-face units-per-em="512" ascent="480" descent="-32" />
8
+<missing-glyph horiz-adv-x="512" />
9
+<glyph unicode="&#x20;" d="" horiz-adv-x="256" />
10
+<glyph unicode="&#xe600;" d="M162.143 99.956c-13.522-0.146-24.863 7.774-29.852 20.164-1.911 4.822-1.9 9.598-1.865 13.781 0.146 11.159 5.852 18.418 10.793 23.563l176.701 185.143c4.673 4.908 10.599 7.942 18.122 9.315 1.569 0.284 3.145 0.427 4.69 0.443 11.064 0.12 22.613-6.356 27.503-15.401 2.315-4.202 3.714-8.478 4.301-13.042 1.106-8.555-0.829-16.432-5.736-23.433-1.303-1.836-2.858-3.44-4.421-5.014l-158.308-166.022c-6.047-6.321-12.078-12.64-17.983-19.085-6.311-6.825-13.743-10.366-22.099-10.457 0 0.002-1.811 0.046-1.846 0.046zM339.482 168.63c-10.974 0-21.341 4.307-29.194 12.099l-110.512 110.16c-7.819 7.809-12.137 18.148-12.137 29.133 0.016 10.763 4.192 20.82 11.727 28.332l120.504 120.138c7.565 7.526 17.655 11.675 28.437 11.675 10.971 0 21.372-4.306 29.192-12.1l110.494-110.142c15.955-15.98 16.142-41.753 0.411-57.482l-120.487-120.12c-7.568-7.542-17.654-11.693-28.435-11.693zM338.851 229.352l100.377 100.053-90.29 90.057-100.406-100.082 90.319-90.028zM151.84-31.065c-10.987 0-21.341 4.274-29.191 12.070l-110.512 110.188c-7.817 7.793-12.138 18.13-12.138 29.103 0.015 10.777 4.192 20.836 11.727 28.348l120.492 120.137c7.565 7.527 17.667 11.676 28.435 11.676 11.003 0 21.375-4.305 29.209-12.101l110.495-110.158c15.952-15.967 16.143-41.738 0.411-57.45l-120.49-120.154c-7.565-7.512-17.672-11.658-28.438-11.658zM151.227 29.654l100.362 100.038-90.306 90.060-100.389-100.087 90.334-90.012z" horiz-adv-x="501" />
11
+<glyph unicode="&#xe601;" d="M478.031 481.466h-409.912c-36.518 0-66.245-30.358-66.245-67.658v-270.103c0-37.269 29.727-67.623 66.245-67.623h17.913v-106.471l172.493 106.471h219.506c36.482 0 66.21 30.356 66.21 67.623v270.101c0 37.301-29.728 67.659-66.21 67.659zM248.25 146.943l-97.857-61.998v61.998h-79.13v263.628h403.594l0.032-263.627h-226.639zM119.531 357.777h302.563v-55.31h-302.563v55.31zM119.531 261.238h302.563v-55.308h-302.563v55.308z" horiz-adv-x="544" />
12
+<glyph unicode="&#xe602;" d="M477.908 480.159h-411.421c-36.651 0-66.487-30.466-66.487-67.922v-271.093c0-37.425 29.836-67.892 66.487-67.892h411.421c36.62 0 66.458 30.467 66.458 67.892v271.093c0 37.457-29.838 67.922-66.458 67.922zM474.755 144.392h-405.113v264.611h405.082l0.031-264.611zM472.61 0.17c0-17.869-14.13-32.33-31.603-32.33h-337.614c-17.475 0-31.605 14.461-31.605 32.33v14.809c0 17.85 14.13 32.329 31.605 32.329h337.614c17.473 0 31.603-14.478 31.603-32.329v-14.809zM388.396 171.217l-151.334 151.303 56.206 56.158 151.273-151.301v-56.159z" horiz-adv-x="545" />
13
+<glyph unicode="&#xe603;" d="M476.248 477.533h-409.344c-36.405 0-66.091-30.315-66.091-67.581v-375.36c0-37.236 29.686-67.55 66.091-67.55h409.343c36.468 0 66.157 30.313 66.157 67.55v375.361c0.001 37.266-29.689 67.579-66.156 67.579zM473.173 37.825h-403.070v368.911h403.007l0.063-368.911zM342.877 337.272h108.455v-283.379h-108.456v283.379zM214.336 273.001h108.456v-219.108h-108.456v219.108zM86.169 208.73h108.081v-154.839h-108.081v154.839z" horiz-adv-x="544" />
14
+<glyph unicode="&#xe604;" d="M439.13 482.757c-81.772 0-148.286-66.518-148.286-148.306v-21.876h-224.454c-36.57 0-66.388-30.454-66.388-67.875v-206.384c0-37.389 29.819-67.839 66.388-67.839h282.076c36.632 0 66.459 30.45 66.459 67.839v206.384c0 35.027-26.134 63.948-59.52 67.504v22.247c0 46.183 37.577 83.745 83.726 83.745 46.152 0 83.731-37.56 83.731-83.745v-38.711c0-17.841 14.442-32.282 32.278-32.282 17.845 0 32.284 14.441 32.284 32.282v38.711c-0.001 81.788-66.514 148.306-148.293 148.306z" horiz-adv-x="590" />
15
+<glyph unicode="&#xe605;" d="M0.759 320.807h138.767v159.899c0 0-39.017-4.051-88.090-55.817-49.069-51.764-50.676-104.082-50.676-104.082zM341.64 480.706h-169.842v-192.298l-171.040 0.125-0.757 1.734v-255.251c0-36.923 30.7-66.99 68.424-66.99h273.217c37.757 0 68.456 30.068 68.456 66.99v378.702c-0.002 36.921-30.699 66.988-68.457 66.988zM345.927 72.582h-286.424v46.394h286.423v-46.394zM345.927 169.401h-286.424v46.392h286.423v-46.392z" horiz-adv-x="410" />
16
+<glyph unicode="&#xe606;" d="M476.95 481.193h-409.887c-36.483 0-66.209-30.356-66.209-67.672v-270.084c0-37.284 29.727-67.639 66.209-67.639h17.912v-106.445l172.483 106.445h219.493c36.482 0 66.208 30.355 66.208 67.639v270.084c0.001 37.316-29.725 67.672-66.207 67.672zM247.214 146.677l-97.885-62v62h-79.092v263.626h403.539l0.062-263.626h-226.625z" horiz-adv-x="545" />
17
+<glyph unicode="&#xe607;" d="M354.757 310.047v22.227c0 81.545-66.331 147.875-147.875 147.875-81.546 0-147.876-66.329-147.876-147.875v-22.227c-33.113-3.697-59.007-32.458-59.007-67.304v-205.811c0-37.315 29.741-67.683 66.236-67.683h281.291c36.529 0 66.267 30.368 66.267 67.683v205.811c0 34.848-25.896 63.609-59.037 67.304zM206.882 415.769c46.022 0 83.493-37.472 83.493-83.494v-21.816h-166.989v21.816c0 46.022 37.441 83.494 83.495 83.494z" horiz-adv-x="414" />
18
+<glyph unicode="&#xe608;" d="M613.039 358.427l-90.297-88.124v109.103c0 37.441-29.829 67.911-66.474 67.911h-318.101c-36.644 0-66.469-30.47-66.469-67.911v-305.329c0-37.425 29.826-67.894 66.469-67.894h318.101c36.645 0 66.474 30.469 66.474 67.894v86.562l96.954-77.070c24.451-17.791 48.463 2.608 48.463 20.292v242.327c0.001 17.682-28.015 35.754-55.122 12.24zM301.315 99.154c-70.723 0-128.065 57.342-128.065 128.066s57.341 128.065 128.065 128.065c70.724 0 128.067-57.341 128.067-128.065 0-70.725-57.344-128.066-128.067-128.066zM296.894 299.788c-40.335 0-73.037-32.704-73.037-73.036 0-40.335 32.703-73.040 73.037-73.040 40.331 0 73.036 32.707 73.036 73.040 0 40.332-32.705 73.036-73.036 73.036zM296.894 260.049c-14.916 0-27.014-12.116-27.014-27.013 0-4.423-3.594-8.004-8.005-8.004-4.44 0-8.002 3.58-8.002 8.004 0 23.716 19.291 43.024 43.022 43.024 4.409 0 8.002-3.58 8.002-8.005-0.002-4.426-3.596-8.005-8.002-8.005z" horiz-adv-x="667" />
19
+<glyph unicode="&#xe609;" d="M611.967 358.573l-90.149-87.978v108.924c0 3.831-0.333 7.574-0.951 11.216l36.847 32.673c13.174 11.705 14.42 31.9 2.684 45.12-11.737 13.203-31.902 14.436-45.136 2.7l-504.51-447.356c-13.204-11.705-14.421-31.903-2.699-45.104 6.303-7.118 15.091-10.769 23.925-10.769 7.538 0 15.107 2.652 21.195 8.050l47.92 42.49c10.498-7.313 23.13-11.616 36.796-11.616h317.596c36.55 0 66.33 30.404 66.33 67.769v86.434l96.83-76.978c24.408-17.73 48.383 2.624 48.383 20.292v241.914c0.001 17.653-27.966 35.693-55.062 12.22zM300.757 99.724c-29.405 0-56.283 10.108-77.763 26.899l41.465 36.767c10.431-5.832 22.425-9.193 35.235-9.193 40.267 0 72.916 32.649 72.916 72.918 0 9.71-1.948 18.928-5.428 27.357l43.423 38.501c11.424-19.13 18.006-41.484 18.006-65.391 0-70.607-57.246-127.855-127.853-127.855zM172.899 227.58c0 70.608 57.248 127.857 127.858 127.857 10.75 0 21.038-1.717 30.993-4.214l108.379 96.096h-302.237c-36.569 0-66.349-30.419-66.349-67.799v-259.037l102.947 91.272c-0.654 5.243-1.592 10.426-1.592 15.826z" horiz-adv-x="667" />
20
+<glyph unicode="&#xe60a;" d="M560.562 469.433c-11.74 13.207-31.942 14.425-45.148 2.686l-504.653-447.452c-13.207-11.709-14.426-31.908-2.717-45.116 6.306-7.122 15.112-10.774 23.947-10.774 7.525 0 15.112 2.654 21.201 8.054l128.536 113.967c16.613-11.432 34.994-19.839 54.305-24.856-35.096-17.827-59.386-53.858-59.386-95.947h215.936c0 42.868-25.164 79.558-61.382 97.039 27.475 7.245 52.921 19.983 73.748 38.748 25.944 23.356 56.856 65.757 56.856 135.165v65.162c0 9.406-3.962 17.883-10.293 23.899l106.332 94.279c13.21 11.738 14.424 31.908 2.717 45.147zM395.767 240.946c0-78.993-58.825-114.961-113.495-114.961-17.607 0-34.329 3.608-49.142 10.393l27.868 24.708c7.366-2.295 15.178-3.566 23.305-3.566 44.678 0 80.992 36.344 80.992 80.99v15.050l30.474 27.021v-39.635zM365.295 396.933c0 44.649-36.313 80.992-80.992 80.992-44.649 0-80.992-36.344-80.992-80.992v-158.425c0-0.125 0-0.249 0-0.374l161.984 143.625v15.174zM175.398 213.345c-1.623 8.741-2.559 17.891-2.559 27.601v65.161c0 18.203-14.8 33.002-33.003 33.002-18.233 0-33.002-14.798-33.002-33.002v-65.161c0-28.599 5.558-53.513 14.549-75.466l54.015 47.865z" horiz-adv-x="569" />
21
+<glyph unicode="&#xe60b;" d="M429.207 339.972c-18.298 0-33.123-14.826-33.123-33.091v-65.362c0-79.211-58.991-115.298-113.817-115.298-29.337 0-56.309 9.935-75.93 27.98-22.115 20.409-33.848 50.601-33.848 87.32v65.363c0 18.265-14.827 33.091-33.091 33.091-18.265 0-33.091-14.826-33.091-33.091v-65.363c0-97.917 59.747-157.382 129.589-175.52-35.204-17.855-59.588-54.007-59.588-96.216h216.559c0 42.996-25.204 79.81-61.514 97.286 27.539 7.32 53.060 20.063 73.943 38.895 26.025 23.438 57.004 65.963 57.004 135.553v65.363c0 18.265-14.795 33.091-33.092 33.091zM284.286 157.86c-44.794 0-81.23 36.466-81.23 81.26v158.832c0 44.795 36.435 81.23 81.23 81.23 44.796 0 81.262-36.435 81.262-81.23v-158.832c0.002-44.796-36.464-81.26-81.262-81.26z" horiz-adv-x="569" />
22
+<glyph unicode="&#xe60c;" d="M256.178 480c-141.228 0-256.178-114.919-256.178-256.239 0-141.195 114.95-256.113 256.178-256.113 141.257 0 256.207 114.919 256.207 256.113 0 141.32-114.95 256.239-256.207 256.239zM256.178 7.428c-119.272 0-216.335 97.063-216.335 216.333 0 119.398 97.063 216.429 216.335 216.429 119.3 0 216.428-97.031 216.428-216.429 0-119.27-97.127-216.333-216.428-216.333zM256.272 427.481c-112.377 0-203.754-91.375-203.754-203.657 0-112.281 91.375-203.657 203.754-203.657 112.219 0 203.594 91.377 203.594 203.658-0.002 112.283-91.375 203.658-203.594 203.658zM256.272 63.661c-88.358 0-160.226 71.902-160.226 160.162 0 88.262 71.868 160.162 160.226 160.162 88.262 0 160.098-71.901 160.098-160.162 0-88.26-71.837-160.162-160.098-160.162zM141.925 281.394l-0.477-0.699v-117.207l0.477-0.699c7.879-11.53 18.237-22.271 30.85-31.899l4.481-3.401v189.171l-4.481-3.368c-12.55-9.595-22.907-20.272-30.85-31.899zM207.819 332.865l-1.81-0.667v-220.18l1.81-0.699c9.341-3.527 19.444-5.97 30.883-7.466l3.112-0.381v237.207l-3.082-0.381c-11.119-1.398-21.508-3.876-30.913-7.435zM273.683 340.299l-3.082 0.381v-237.208l3.082 0.381c11.151 1.397 21.538 3.906 30.882 7.432l1.842 0.7v220.244l-1.842 0.667c-9.406 3.526-19.762 6.005-30.882 7.403zM370.49 281.394c-7.846 11.501-18.236 22.24-30.849 31.899l-4.447 3.43v-189.234l4.447 3.401c12.675 9.69 23.066 20.431 30.849 31.93l0.445 0.699v117.176l-0.445 0.7z" horiz-adv-x="513" />
23
+<glyph unicode="&#xe60d;" d="M476.183 480.067h-410.238c-36.514 0-66.266-30.38-66.266-67.728v-376.179c0-37.33 29.752-67.712 66.266-67.712h410.24c36.545 0 66.298 30.383 66.298 67.712v376.179c-0.001 37.347-29.754 67.728-66.299 67.728zM473.067 39.401h-403.947v369.731h403.917l0.029-369.731zM284.871 255.938l45.886 48.433-38.652 38.654 158.197 42.52-42.49-158.195-37.678 37.647-45.917-48.433zM257.382 192.281l-45.883-48.433 38.65-38.652-158.194-42.522 42.489 158.194 37.678-37.645 45.917 48.435z" horiz-adv-x="545" />
24
+<glyph unicode="&#xe60e;" d="M476.613 479.59h-410.332c-36.523 0-66.281-30.388-66.281-67.744v-376.262c0-37.324 29.759-67.71 66.281-67.71h410.33c36.553 0 66.312 30.388 66.312 67.711v376.262c0.001 37.356-29.758 67.744-66.311 67.744zM473.497 38.824h-404.039v369.798h404.009l0.031-369.798zM457.769 353.35l-45.897-48.445 38.663-38.661-158.232-42.515 42.5 158.232 37.687-37.67 45.926 48.445zM85.313 94.111l45.897 48.442-38.661 38.663 158.232 42.514-42.499-158.23-37.686 37.671-45.928-48.445z" horiz-adv-x="545" />
25
+</font></defs></svg>

Binārs
fonts/jitsi.ttf Parādīt failu


Binārs
fonts/jitsi.woff Parādīt failu


Binārs
images/avatar1.png Parādīt failu


Binārs
images/avatarprezi.png Parādīt failu


Binārs
images/watermark.png Parādīt failu


+ 22
- 18
index.html Parādīt failu

@@ -20,10 +20,14 @@
20 20
     <script src="chat.js?v=3"></script><!-- chat logic -->
21 21
     <script src="util.js?v=2"></script><!-- utility functions -->
22 22
     <script src="etherpad.js?v=5"></script><!-- etherpad plugin -->
23
+    <script src="prezi.js?v=1"></script><!-- prezi plugin -->
23 24
     <script src="smileys.js?v=1"></script><!-- smiley images -->
24 25
     <script src="replacement.js?v=5"></script><!-- link and smiley replacement -->
25 26
     <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
27
+    <link rel="stylesheet" href="css/font.css"/>
26 28
     <link rel="stylesheet" type="text/css" media="screen" href="css/main.css?v=19"/>
29
+    <link rel="stylesheet" type="text/css" media="screen" href="css/videolayout_default.css?v=1" id="videolayout_default"/>
30
+    <link rel="stylesheet" type="text/css" media="screen" href="css/videolayout_fullscreen.css?v=1" id="videolayout_fullscreen" disabled>
27 31
     <link rel="stylesheet" href="css/jquery-impromptu.css?v=4">
28 32
     <link rel="stylesheet" href="css/modaldialog.css?v=3">
29 33
     <!--
@@ -39,32 +43,32 @@
39 43
         <a href="http://jitsi.org" target="_blank"><div id="leftlogo"></div></a>
40 44
         <a href="http://www.estos.com/" target="_blank"><div id="rightlogo"></div></a>
41 45
         <span id="toolbar">
42
-            <a class="button" onclick='buttonClick("#mute", "fa fa-microphone fa-lg fa fa-microphone-slash fa-lg");toggleAudio();'>
43
-                <i id="mute" title="Mute / unmute" class="fa fa-microphone fa-lg"></i></a>
46
+            <a class="button" onclick='buttonClick("#mute", "icon-microphone icon-mic-disabled");toggleAudio();'>
47
+                <i id="mute" title="Mute / unmute" class="icon-microphone"></i></a>
44 48
             <div class="header_button_separator"></div>
45
-            <a class="button" onclick='buttonClick("#video");toggleVideo();'>
46
-                <i id="video" title="Start / stop camera" class="fa fa-video-camera fa-lg"></i></a>
49
+            <a class="button" onclick='buttonClick("#video", "icon-camera icon-camera-disabled");toggleVideo();'>
50
+                <i id="video" title="Start / stop camera" class="icon-camera"></i></a>
47 51
             <div class="header_button_separator"></div>
48
-            <a class="button" onclick="openLockDialog();"><i id="lockIcon" title="Lock/unlock room" class="fa fa-unlock fa-lg"></i></a>
52
+            <a class="button" onclick="openLockDialog();"><i id="lockIcon" title="Lock/unlock room" class="icon-security"></i></a>
49 53
             <div class="header_button_separator"></div>
50
-            <a class="button" onclick="openLinkDialog();"><i title="Invite others" class="fa fa-link fa-lg"></i></a>
54
+            <a class="button" onclick="openLinkDialog();"><i title="Invite others" class="icon-link"></i></a>
51 55
             <div class="header_button_separator"></div>
52 56
             <span class="toolbar_span">
53
-                <a class="button" onclick='Chat.toggleChat();'><i id="chat" title="Open chat" class="fa fa-comments-o fa-lg"></i></a>
57
+                <a class="button" onclick='Chat.toggleChat();'><i id="chatButton" title="Open chat" class="icon-chat"></i></a>
54 58
                 <span id="unreadMessages"></span>
55 59
             </span>
56 60
             <div class="header_button_separator"></div>
57
-            <a class="button" onclick='openPreziDialog();'><i title="Share prezi" class="fa fa-picture-o fa-lg"></i></a>
61
+            <a class="button" onclick='Prezi.openPreziDialog();'><i title="Share prezi" class="icon-prezi"></i></a>
58 62
             <span id="etherpadButton">
59 63
                 <div class="header_button_separator"></div>
60
-                <a class="button" onclick='Etherpad.toggleEtherpad(0);'><i title="Open shared document" class="fa fa-file-text fa-lg"></i></a>
64
+                <a class="button" onclick='Etherpad.toggleEtherpad(0);'><i title="Open shared document" class="icon-share-doc"></i></a>
61 65
             </span>
62 66
             <div class="header_button_separator"></div>
63 67
             <span id="desktopsharing" style="display: none">
64
-                <a class="button" onclick="toggleScreenSharing();"><i title="Share screen" class="fa fa-desktop fa-lg"></i></a>
68
+                <a class="button" onclick="toggleScreenSharing();"><i title="Share screen" class="icon-share-desktop"></i></a>
65 69
                 <div class="header_button_separator"></div>
66 70
             </span>
67
-            <a class="button" onclick='toggleFullScreen();'><i title="Enter / Exit Full Screen" class="fa fa-arrows-alt fa-lg"></i></a>
71
+            <a class="button" onclick='buttonClick("#fullScreen", "icon-full-screen icon-exit-full-screen");toggleFullScreen();'><i id="fullScreen" title="Enter / Exit Full Screen" class="icon-full-screen"></i></a>
68 72
         </span>
69 73
     </div>
70 74
     <div id="settings">
@@ -76,20 +80,20 @@
76 80
         <input id="connect" type="submit" value="Connect" />
77 81
       </form>
78 82
     </div>
79
-
80
-    <div id="videospace">
81
-        <div class="fade_line"></div>
83
+    <div id="reloadPresentation"><a onclick='Prezi.reloadPresentation();'><i title="Reload Prezi" class="fa fa-repeat fa-lg"></i></a></div>
84
+    <div id="videospace" onmousemove="showToolbar();">
82 85
         <div id="largeVideoContainer" class="videocontainer">
83
-            <div id="reloadPresentation"><a onclick='reloadPresentation();'><i title="Reload Prezi" class="fa fa-repeat fa-lg"></i></a></div>
84 86
             <div id="presentation"></div>
85 87
             <div id="etherpad"></div>
88
+            <a href="http://jitsi.org" target="_new"><div id="watermark"></div></a>
86 89
             <video id="largeVideo" autoplay oncontextmenu="return false;"></video>
87 90
         </div>
88
-        <div class="fade_line"></div>
89 91
         <div id="remoteVideos">
90 92
             <span id="localVideoContainer" class="videocontainer">
91
-                <span id="localNick"></span>
92
-                <!--<video id="localVideo" autoplay oncontextmenu="return false;" muted></video> - is now per stream generated -->
93
+                <span id="localNick" class="nick"></span>
94
+                <span id="localVideoWrapper">
95
+                    <!--<video id="localVideo" autoplay oncontextmenu="return false;" muted></video> - is now per stream generated -->
96
+                </span>
93 97
                 <audio id="localAudio" autoplay oncontextmenu="return false;" muted></audio>
94 98
                 <span class="focusindicator"></span>
95 99
             </span>

+ 333
- 0
prezi.js Parādīt failu

@@ -0,0 +1,333 @@
1
+var Prezi = (function (my) {
2
+    var preziPlayer = null;
3
+
4
+    /**
5
+     * Reloads the current presentation.
6
+     */
7
+    my.reloadPresentation = function() {
8
+        var iframe = document.getElementById(preziPlayer.options.preziId);
9
+        iframe.src = iframe.src;
10
+    };
11
+
12
+    /**
13
+     * Shows/hides a presentation.
14
+     */
15
+    my.setPresentationVisible = function (visible) {
16
+        if (visible) {
17
+            // Trigger the video.selected event to indicate a change in the
18
+            // large video.
19
+            $(document).trigger("video.selected", [true]);
20
+
21
+            $('#largeVideo').fadeOut(300, function () {
22
+                setLargeVideoVisible(false);
23
+                $('#presentation>iframe').fadeIn(300, function() {
24
+                    $('#presentation>iframe').css({opacity:'1'});
25
+                    dockToolbar(true);
26
+                });
27
+            });
28
+        }
29
+        else {
30
+            if ($('#presentation>iframe').css('opacity') == '1') {
31
+                $('#presentation>iframe').fadeOut(300, function () {
32
+                    $('#presentation>iframe').css({opacity:'0'});
33
+                    $('#reloadPresentation').css({display:'none'});
34
+                    $('#largeVideo').fadeIn(300, function() {
35
+                        setLargeVideoVisible(true);
36
+                        dockToolbar(false);
37
+                    });
38
+                });
39
+            }
40
+        }
41
+    };
42
+
43
+    /**
44
+     * Returns <tt>true</tt> if the presentation is visible, <tt>false</tt> -
45
+     * otherwise.
46
+     */
47
+    my.isPresentationVisible = function () {
48
+        return ($('#presentation>iframe') != null
49
+                && $('#presentation>iframe').css('opacity') == 1);
50
+    };
51
+
52
+    /**
53
+     * Opens the Prezi dialog, from which the user could choose a presentation
54
+     * to load.
55
+     */
56
+    my.openPreziDialog = function() {
57
+        var myprezi = connection.emuc.getPrezi(connection.emuc.myroomjid);
58
+        if (myprezi) {
59
+            $.prompt("Are you sure you would like to remove your Prezi?",
60
+                    {
61
+                    title: "Remove Prezi",
62
+                    buttons: { "Remove": true, "Cancel": false},
63
+                    defaultButton: 1,
64
+                    submit: function(e,v,m,f){
65
+                    if(v)
66
+                    {
67
+                        connection.emuc.removePreziFromPresence();
68
+                        connection.emuc.sendPresence();
69
+                    }
70
+                }
71
+            });
72
+        }
73
+        else if (preziPlayer != null) {
74
+            $.prompt("Another participant is already sharing a Prezi." +
75
+                    "This conference allows only one Prezi at a time.",
76
+                     {
77
+                     title: "Share a Prezi",
78
+                     buttons: { "Ok": true},
79
+                     defaultButton: 0,
80
+                     submit: function(e,v,m,f){
81
+                        $.prompt.close();
82
+                     }
83
+                     });
84
+        }
85
+        else {
86
+            var openPreziState = {
87
+            state0: {
88
+                html:   '<h2>Share a Prezi</h2>' +
89
+                        '<input id="preziUrl" type="text" ' +
90
+                        'placeholder="e.g. ' +
91
+                        'http://prezi.com/wz7vhjycl7e6/my-prezi" autofocus>',
92
+                persistent: false,
93
+                buttons: { "Share": true , "Cancel": false},
94
+                defaultButton: 1,
95
+                submit: function(e,v,m,f){
96
+                    e.preventDefault();
97
+                    if(v)
98
+                    {
99
+                        var preziUrl = document.getElementById('preziUrl');
100
+
101
+                        if (preziUrl.value)
102
+                        {
103
+                            var urlValue
104
+                                = encodeURI(Util.escapeHtml(preziUrl.value));
105
+
106
+                            if (urlValue.indexOf('http://prezi.com/') != 0
107
+                                && urlValue.indexOf('https://prezi.com/') != 0)
108
+                            {
109
+                                $.prompt.goToState('state1');
110
+                                return false;
111
+                            }
112
+                            else {
113
+                                var presIdTmp = urlValue.substring(
114
+                                        urlValue.indexOf("prezi.com/") + 10);
115
+                                if (!Util.isAlphanumeric(presIdTmp)
116
+                                        || presIdTmp.indexOf('/') < 2) {
117
+                                    $.prompt.goToState('state1');
118
+                                    return false;
119
+                                }
120
+                                else {
121
+                                    connection.emuc
122
+                                        .addPreziToPresence(urlValue, 0);
123
+                                    connection.emuc.sendPresence();
124
+                                    $.prompt.close();
125
+                                }
126
+                            }
127
+                        }
128
+                    }
129
+                    else
130
+                        $.prompt.close();
131
+                }
132
+            },
133
+            state1: {
134
+                html:   '<h2>Share a Prezi</h2>' +
135
+                        'Please provide a correct prezi link.',
136
+                persistent: false,
137
+                buttons: { "Back": true, "Cancel": false },
138
+                defaultButton: 1,
139
+                submit:function(e,v,m,f) {
140
+                    e.preventDefault();
141
+                    if(v==0)
142
+                        $.prompt.close();
143
+                    else
144
+                        $.prompt.goToState('state0');
145
+                }
146
+            }
147
+            };
148
+
149
+            var myPrompt = jQuery.prompt(openPreziState);
150
+
151
+            myPrompt.on('impromptu:loaded', function(e) {
152
+                        document.getElementById('preziUrl').focus();
153
+                        });
154
+            myPrompt.on('impromptu:statechanged', function(e) {
155
+                        document.getElementById('preziUrl').focus();
156
+                        });
157
+        }
158
+    };
159
+
160
+    /**
161
+     * A new presentation has been added.
162
+     * 
163
+     * @param event the event indicating the add of a presentation
164
+     * @param jid the jid from which the presentation was added
165
+     * @param presUrl url of the presentation
166
+     * @param currentSlide the current slide to which we should move
167
+     */
168
+    var presentationAdded = function(event, jid, presUrl, currentSlide) {
169
+        console.log("presentation added", presUrl);
170
+
171
+        var presId = getPresentationId(presUrl);
172
+        var elementId = 'participant_'
173
+                        + Strophe.getResourceFromJid(jid)
174
+                        + '_' + presId;
175
+
176
+        addRemoteVideoContainer(elementId);
177
+        resizeThumbnails();
178
+
179
+        var controlsEnabled = false;
180
+        if (jid === connection.emuc.myroomjid)
181
+            controlsEnabled = true;
182
+
183
+        Prezi.setPresentationVisible(true);
184
+        $('#largeVideoContainer').hover(
185
+            function (event) {
186
+                if (Prezi.isPresentationVisible()) {
187
+                    var reloadButtonRight = window.innerWidth
188
+                        - $('#presentation>iframe').offset().left
189
+                        - $('#presentation>iframe').width();
190
+
191
+                    $('#reloadPresentation').css({  right: reloadButtonRight,
192
+                                                    display:'inline-block'});
193
+                }
194
+            },
195
+            function (event) {
196
+                if (!Prezi.isPresentationVisible())
197
+                    $('#reloadPresentation').css({display:'none'});
198
+                else {
199
+                    var e = event.toElement || event.relatedTarget;
200
+
201
+                    if (e && e.id != 'reloadPresentation' && e.id != 'header')
202
+                        $('#reloadPresentation').css({display:'none'});
203
+                }
204
+            });
205
+
206
+        preziPlayer = new PreziPlayer(
207
+                    'presentation',
208
+                    {preziId: presId,
209
+                    width: getPresentationWidth(),
210
+                    height: getPresentationHeihgt(),
211
+                    controls: controlsEnabled,
212
+                    debug: true
213
+                    });
214
+
215
+        $('#presentation>iframe').attr('id', preziPlayer.options.preziId);
216
+
217
+        preziPlayer.on(PreziPlayer.EVENT_STATUS, function(event) {
218
+            console.log("prezi status", event.value);
219
+            if (event.value == PreziPlayer.STATUS_CONTENT_READY) {
220
+                if (jid != connection.emuc.myroomjid)
221
+                    preziPlayer.flyToStep(currentSlide);
222
+            }
223
+        });
224
+
225
+        preziPlayer.on(PreziPlayer.EVENT_CURRENT_STEP, function(event) {
226
+            console.log("event value", event.value);
227
+            connection.emuc.addCurrentSlideToPresence(event.value);
228
+            connection.emuc.sendPresence();
229
+        });
230
+
231
+        $("#" + elementId).css( 'background-image',
232
+                                'url(../images/avatarprezi.png)');
233
+        $("#" + elementId).click(
234
+            function () {
235
+                Prezi.setPresentationVisible(true);
236
+            }
237
+        );
238
+    };
239
+
240
+    /**
241
+     * A presentation has been removed.
242
+     * 
243
+     * @param event the event indicating the remove of a presentation
244
+     * @param jid the jid for which the presentation was removed
245
+     * @param the url of the presentation
246
+     */
247
+    var presentationRemoved = function (event, jid, presUrl) {
248
+        console.log('presentation removed', presUrl);
249
+        var presId = getPresentationId(presUrl);
250
+        Prezi.setPresentationVisible(false);
251
+        $('#participant_'
252
+                + Strophe.getResourceFromJid(jid)
253
+                + '_' + presId).remove();
254
+        $('#presentation>iframe').remove();
255
+        if (preziPlayer != null) {
256
+            preziPlayer.destroy();
257
+            preziPlayer = null;
258
+        }
259
+    };
260
+
261
+    /**
262
+     * Returns the presentation id from the given url.
263
+     */
264
+    function getPresentationId (presUrl) {
265
+        var presIdTmp = presUrl.substring(presUrl.indexOf("prezi.com/") + 10);
266
+        return presIdTmp.substring(0, presIdTmp.indexOf('/'));
267
+    }
268
+
269
+    /**
270
+     * Returns the presentation width.
271
+     */
272
+    function getPresentationWidth() {
273
+        var availableWidth = Util.getAvailableVideoWidth();
274
+        var availableHeight = getPresentationHeihgt();
275
+
276
+        var aspectRatio = 16.0 / 9.0;
277
+        if (availableHeight < availableWidth / aspectRatio) {
278
+            availableWidth = Math.floor(availableHeight * aspectRatio);
279
+        }
280
+        return availableWidth;
281
+    }
282
+
283
+    /**
284
+     * Returns the presentation height.
285
+     */
286
+    function getPresentationHeihgt() {
287
+        var remoteVideos = $('#remoteVideos');
288
+        return window.innerHeight - remoteVideos.outerHeight();
289
+    }
290
+
291
+    /**
292
+     * Resizes the presentation iframe.
293
+     */
294
+    function resize() {
295
+        if ($('#presentation>iframe')) {
296
+            $('#presentation>iframe').width(getPresentationWidth());
297
+            $('#presentation>iframe').height(getPresentationHeihgt());
298
+        }
299
+    }
300
+
301
+    /**
302
+     * Presentation has been removed.
303
+     */
304
+    $(document).bind('presentationremoved.muc', presentationRemoved);
305
+
306
+    /**
307
+     * Presentation has been added.
308
+     */
309
+    $(document).bind('presentationadded.muc', presentationAdded);
310
+
311
+    /*
312
+     * Indicates presentation slide change.
313
+     */
314
+    $(document).bind('gotoslide.muc', function (event, jid, presUrl, current) {
315
+        if (preziPlayer) {
316
+            preziPlayer.flyToStep(current);
317
+        }
318
+    });
319
+
320
+    /**
321
+     * On video selected event.
322
+     */
323
+    $(document).bind('video.selected', function (event, isPresentation) {
324
+        if (!isPresentation && $('#presentation>iframe'))
325
+            Prezi.setPresentationVisible(false);
326
+    });
327
+
328
+    $(window).resize(function () {
329
+        resize();
330
+    });
331
+
332
+    return my;
333
+}(Prezi || {}));

+ 11
- 0
util.js Parādīt failu

@@ -57,5 +57,16 @@ var Util = (function (my) {
57 57
         return regex.test(unsafeText);
58 58
     };
59 59
 
60
+    /**
61
+     * Returns the available video width.
62
+     */
63
+    my.getAvailableVideoWidth = function() {
64
+        var chatspaceWidth = $('#chatspace').is(":visible")
65
+        ? $('#chatspace').width()
66
+        : 0;
67
+
68
+        return window.innerWidth - chatspaceWidth;
69
+    };
70
+
60 71
     return my;
61 72
 }(Util || {}));

Notiek ielāde…
Atcelt
Saglabāt