2 ================================================================================
4 ================================================================================
5 Copyright (C) 2017 AT&T Intellectual Property
6 ================================================================================
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
11 http://www.apache.org/licenses/LICENSE-2.0
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18 ================================================================================
24 <html xmlns="http://www.w3.org/1999/xhtml" ng-app="abs">
26 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
27 <meta http-equiv="X-UA-Compatible" content="IE=edge">
28 <link type="text/css" rel="stylesheet" href="app/fusion/styles/layout/layout-default-latest.css" />
29 <link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/sandbox/styles/btn.css" >
30 <link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/fn-ebz.css" >
31 <style type="text/css">
33 * NOTE: All CSS is purely cosmetic - it does not affect functionality
34 * http://layout.jquery-dev.com/demos.cfm
37 /* customize borders to avoid double-borders around inner-layouts */
39 border: 0; /* override layout-default-latest.css */
40 border-top: 1px solid #BBB;
41 border-bottom: 1px solid #BBB;
43 .ui-layout-pane-north ,
44 .ui-layout-pane-south {
45 border: 1px solid #BBB;
48 .ui-layout-pane-west ,
49 .ui-layout-pane-east {
51 .ui-layout-pane-center {
56 border: 1px solid #BBB;
59 /* add shading to outer sidebar-panes */
62 background-color: #EEE;
66 background-color: #F8F8F8;
69 /* remove padding & scrolling from panes that are 'containers' for nested layouts */
72 border: 0; /* cosmetic */
78 * customize borders on panes/resizers to make pretty
80 .ui-layout-pane-west { border-right: 0; }
81 .ui-layout-resizer-west { border-left: 1px solid #BBB; }
82 .ui-layout-pane-east { border-left: 0; }
83 .ui-layout-resizer-east { border-right: 1px solid #BBB; }
84 .ui-layout-pane-north { border-bottom: 0; }
85 .ui-layout-resizer-north { border-top: 1px solid #BBB; }
86 .ui-layout-pane-south { border-top: 0; }
87 .ui-layout-resizer-south { border-bottom: 1px solid #BBB; }
89 * add borders to resizers when pane is 'closed'
91 *.ui-layout-resizer-closed { border: 1px solid #BBB; }
94 * show both borders when the resizer is 'dragging'
96 .ui-layout-resizer-west-dragging ,
97 .ui-layout-resizer-east-dragging {
98 border-left: 1px solid #BBB;
99 border-right: 1px solid #BBB;
101 .ui-layout-resizer-north-dragging ,
102 .ui-layout-resizer-south-dragging {
103 border-top: 1px solid #BBB;
104 border-bottom: 1px solid #BBB;
109 layout toggler background image
111 .ui-layout-toggler-west, .ui-layout-toggler-east {
113 background-image: url("static/fusion/images/layout/panel-e-w-toggle.png");
114 background-size: 10px 10px;
115 background-repeat: no-repeat;
116 background-position: center;
119 .ui-layout-toggler-north, .ui-layout-toggler-south {
121 background-image: url("static/fusion/images/layout/panel-n-s-toggle.png");
122 background-size: 10px 10px;
123 background-repeat: no-repeat;
124 background-position: center;
127 body{background-color:#fff;font-size:14px;font-size:.875rem;margin:0;padding:0px 0 20px;position:relative}
132 <!-- LAYOUT v 1.3.0 -->
133 <script type="text/javascript" src="app/fusion/scripts/layout/jquery-latest.js"></script>
134 <script type="text/javascript" src="app/fusion/scripts/layout/jquery-ui-latest.js"></script>
135 <script type="text/javascript" src="app/fusion/scripts/layout/jquery.layout-latest.js"></script>
136 <script type="text/javascript" src="app/fusion/scripts/webrtc/RTCMultiConnection.js"></script>
137 <script type="text/javascript" src="app/fusion/scripts/socket/peerBroadcast.js"></script>
138 <script type="text/javascript" src="app/fusion/scripts/layout/debug.js"></script>
139 <link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/fn-ebz.css" >
140 <link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/sandbox/styles/style.css" >
142 <script src= "app/fusion/external/ebz/angular_js/angular.js"></script>
143 <script src= "app/fusion/external/ebz/angular_js/angular-route.min.js"></script>
144 <script src= "app/fusion/external/ebz/angular_js/angular-sanitize.js"></script>
145 <script src= "app/fusion/external/ebz/angular_js/app.js"></script>
146 <script src= "app/fusion/external/ebz/angular_js/gestures.js"></script>
148 <%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %>
149 <script src="app/fusion/scripts/modalService.js"></script>
150 <script src="app/fusion/external/ebz/sandbox/att-abs-tpls.js" type="text/javascript"></script>
151 <script src="app/fusion/scripts/att_angular_gridster/ui-gridster-tpls.js"></script>
152 <script src="app/fusion/scripts/att_angular_gridster/angular-gridster.js"></script>
153 <script src= "app/fusion/external/ebz/angular_js/checklist-model.js"></script>
155 body{background-color:#fff;font-size:14px;font-size:.875rem;margin:0;padding:0px 0 20px;position:relative}
158 <script type="text/javascript">
161 var popupModalService;
163 app.controller("collaborationController", function ($scope,$http,modalService, $modal) {
164 popupModalService = modalService;
169 $(document).ready(function () {
172 panelLayout = $('body').layout({
173 center__paneSelector: ".outer-center"
174 , west__paneSelector: ".outer-west"
175 , east__paneSelector: ".outer-east"
178 , spacing_open: 8 // ALL panes
179 , spacing_closed: 12 // ALL panes
181 , center__childOptions: {
182 center__paneSelector: ".inner-center"
183 , west__paneSelector: ".inner-west"
184 , east__paneSelector: ".inner-east"
187 , spacing_open: 8 // ALL panes
188 , spacing_closed: 8 // ALL panes
189 , west__spacing_closed: 12
190 , east__spacing_closed: 12
199 function initializeConnections() {
201 var channelId = null;
202 channelId = location.href.replace(/\/|:|#|%|\.|\[|\]/g, '');
203 var videoChannelId = channelId.concat("video");
204 var screenChannelId = channelId.concat("screen");
206 videoConnection = new RTCMultiConnection(videoChannelId);
207 screenConnection = new RTCMultiConnection(screenChannelId);
209 configConnection(videoConnection,true,true,false,true,false);
210 configConnection(screenConnection,false,false,true,false,true);
214 function configConnection(_connection, _audio, _video, _screen, _data, _oneway) {
215 _connection.session = {
216 audio: _audio, // by default, it is true
217 video: _video, // by default, it is true
224 _connection.direction = "one-to-one";
226 if( _data == true ) {
227 _connection.onmessage = function(e) {
230 console.debug(e.userid, 'posted', e.data);
231 console.log('latency:', e.latency, 'ms');
238 function assignStreamToDom() {
241 screenConnection.screenbody = document.querySelector('.screenContainer1');
242 screenConnection.videobody = document.querySelector('.videoContainer2');
244 videoConnection.screenbody = document.querySelector('.screenContainer2');
245 videoConnection.videobody = document.querySelector('.videoContainer1');
248 function maximizeLayout() {
250 // open the panes and maximize the window.
251 top.window.resizeTo(screen.availWidth,screen.availHeight);
252 panelLayout.open('west');
253 // panelLayout.open('south'); is not working due to state initialization problem; debug to find out. so replacing the call with work around below - hack.
254 $(".ui-layout-toggler-south-closed").first().click();
258 function minimizeLayout() {
260 // close the panes and minimize the window.
261 top.window.resizeTo(screen.availWidth - 2*screen.availWidth/3, screen.availHeight - screen.availHeight/2);
262 panelLayout.close('west');
263 // panelLayout.close('south'); is not working due to state initialization problem; debug to find out. so replacing the call with work around below - hack.
264 $(".ui-layout-toggler-south-opened").first().click();
267 function emptyContainers() {
268 $('.screenContainer1').empty();
269 $('.videoContainer2').empty();
271 $('.screenContainer2').empty();
272 $('.videoContainer1').empty();
275 function appendDIV(div, parent) {
276 if (typeof div === 'string') {
278 div = document.createElement('div');
279 div.innerHTML = content;
282 var chatOutput = document.getElementById('chat-output'),
283 fileProgress = document.getElementById('file-progress');
285 if (!parent) chatOutput.insertBefore(div, chatOutput.firstChild);
286 else fileProgress.insertBefore(div, fileProgress.firstChild);
289 $('#chat-input').focus();
292 function confirmClose() {
293 var message = "Are you sure you want to close the session?";
295 if(popupModalService != undefined) {
296 popupModalService.popupConfirmWin("Confirm", message, function(){ location.reload();});
299 else if (confirm(message) == true) {
301 //window.opener.location.reload(); // go to the parent window
309 function notifyOthers() {
311 // var websocket = localStorage.getItem('notifySocket');
312 //if( websocket != null) {
313 // handling websocket peer broadcast session
314 var currentUser = "${sessionScope.user.orgUserId}";
315 var initialPageVisit = "${sessionScope.initialPageVisit}";
318 var userList = location.search.split('chat_id=')[1].split('-');
319 for(var i=0;i<userList.length;i++) {
320 if(userList[i] !== currentUser) {
321 remoteUser = userList[i];
326 socketSetup(initialPageVisit, currentUser, remoteUser,"socketSend");
335 function makeChatVisible() {
337 $('#chat-input').css("visibility", 'visible');
342 /* on click button enabled*/
343 document.getElementById('share-screen').onclick = function() {
346 videoConnection.close();
347 screenConnection.close();
353 videoConnection.open();
354 screenConnection.open();
363 document.getElementById('stop-share-screen').onclick = function() {
367 videoConnection.close();
368 screenConnection.close();
374 document.getElementById('view-screen').onclick = function() {
380 // timeout is required for the sharing to properly work
381 setTimeout(function() {
382 screenConnection.connect();
384 setTimeout(function() {
385 videoConnection.connect();
391 document.getElementById('chat-input').onkeypress = function(e) {
392 if (e.keyCode !== 13 || !this.value) return;
393 var message = "<b>${model.name}</b>: " + this.value;
396 // sending text message
397 videoConnection.send(message);
403 document.getElementById('file').onchange = function() {
404 videoConnection.send(this.files[0]);
409 //document.querySelector('.screenContainerPane').appenChild(document.querySelector('.screenContainer'));
410 //document.querySelector('.videoContainerPane').appendChild(document.querySelector('.videoContainer'));
412 //panelLayout.bindButton($('#share-screen'), 'open', 'outer-west');
413 //panelLayout.bindButton($('#stop-share-screen'), 'close', 'outer-west');
414 var videoConnection = null, screenConnection = null;
415 initializeConnections();
419 //document.getElementById('share-screen').click();
431 <button id="share-screen" hidden="true" style="display: none;" class="setup">Share Your Screen</button>
432 <button id="stop-share-screen" hidden="true" style="display: none;" class="setup">Stop Share Your Screen</button>
433 <button id="view-screen" hidden="true" style="display: none;" class="setup">View My Screen</button>
437 <div class="outer-center" style="position: absolute; left: 12px; right: 0px; top: 0px;bottom: 0px;">
438 <div class="inner-center">
440 <!-- <jsp:include page="/WEB-INF/fusion/zul/chatOne.zul" /> -->
444 <table style="width: 100%;">
447 <button id="share-screen" class="button button--primary button--small setup">Start Session</button>
448 <button id="stop-share-screen" class="button button--primary button--small setup">Stop Session</button>
449 <button id="view-screen" class="button button--primary button--small setup">View</button>
458 <input type="text" id="chat-input" style="font-size: 1.2em;visibility:collapse;" placeholder="type here.."/>
459 <div id="chat-output"></div>
462 <td style="background: white;">
463 <input type="file" id="file">
464 <div id="file-progress"></div>
473 <div id="inner-south" class="ui-layout-south">
474 <div class="videoContainer1"></div>
475 <div class="videoContainer2"></div>
480 <div class="outer-west">
481 <div class="screenContainer1"></div>
482 <div class="screenContainer2"></div>
483 <div ng-controller="collaborationController">