video/comms/webRTC-over-websockets/js/main.js

259 lines
7.2 KiB
JavaScript

var socketAddress = 'ws://localhost:1337/';
var RTCApp = {
name: null,
webRTC: null,
commChannel: null,
message: null
};
RTCApp.commChannel = signaling({webSocketAddress : socketAddress, id: RTCApp.name });
RTCApp.commChannel.addCallback('presence' , presenceCallback);
RTCApp.commChannel.addCallback('s-offer', accept);
RTCApp.commChannel.addCallback('roster', roster);
RTCApp.webRTC = webrtc({sourcevid : document.getElementById('sourceSmallvid'),
stunServer : "stun.l.google.com:19302",
commChannel : RTCApp.commChannel,
onremote : remoteCallback,
constrains : 'dynamic'
});
RTCApp.webRTC.startVideo();
var users = {};
var caller, newUser;
var snd = new Audio("data/ringtone.wav");
var newUsers = {};
$(document).ready(function() {
//List of people and rooms is either retrived by uncommenting lines below,
//or after first successfull login (when the socket server send it to the logged user)
//loadFromJSON("data/people.json", "ajax-modal", ".people-carousel", false);
//loadFromJSON("data/rooms.json", "ajax-room-modal", ".rooms-carousel", true);
$('#people_content').hide();
$('#room_content').hide();
$('#people').fadeIn();
$('[id^="myCarousel"]').carousel({interval: false});
});
$("#form").submit(function(event) {
event.preventDefault();
RTCApp.name = $("#user").val();
RTCApp.commChannel.sendPresence(RTCApp.name, 'on');
$('#user').attr('readonly', true);
$("#submit").hide();
});
$('#accept').bind('click', function() {
RTCApp.commChannel.answer(caller, 'accept');
$('#acceptModal').modal('hide');
});
$('#reject').bind('click', function() {
RTCApp.commChannel.answer(caller, 'reject');
$('#acceptModal').modal('hide');
});
function accept(message){
if(message.from === RTCApp.name){
console.log("can't call yourself ");
return;
}
caller = message.from;
snd.play();
$('#callerTitle').text('Incoming call');
$('#caller').text('Caller id '+ message.from);
$('#acceptModal').modal('show');
}
function talkFunction(flag){
var callback = flag === true? "hide" : "show";
$('#people_content')[callback]();
$('#room_content')[callback]();
}
function remoteCallback(from, added, stream){
var resource = 'resource_'+ from;
if(added){
if (window.webkitURL) {
$('.inner').append('<video class="span4" id=' + resource + ' src=' +
window.webkitURL.createObjectURL(event.stream) + ' autoplay></video>');
} else {
$('.inner').append('<video class="span4" id=' + resource + ' mozSrcObject=' +
event.stream + ' autoplay></video>');
}
} else {
$('#'+resource).attr('src',"");
$('#'+resource).remove();
}
}
$('#acceptNewUser').bind('click', function() {
delete newUsers[newUser];
addNewUser({
"name" : newUser,
"id": newUser,
"img" : "images/person.jpg"
}, "ajax-modal", ".people-carousel");
$('#userModal').modal('hide');
});
$('#rejectNewUser').bind('click', function() {
newUsers[newUser] = false;
$('#userModal').modal('hide');
});
function presenceCallback(message){
roomFlag = message.room !== undefined;
var user_id, room_id;
if(!roomFlag){
$(".ajax-modal").each(function(){
user_id = $(this).attr('user-id');
if(user_id !== undefined && user_id === message.name){
if(message.status === 'on'){
$(this).find('img').attr('src', 'images/online-icon.png');
} else {
$(this).find('img').attr('src', 'images/offline-icon.png');
}
}
});
if(users[message.name] === undefined && message.status === 'on'){
console.log('presence received from the person that is not in the address book ' + message.name);
if(newUsers[message.name] === undefined){
newUsers[message.name] = true;
}
}
}
else{
$(".ajax-room-modal").each(function(){
room_id = $(this).attr('user-id');
if(room_id !== undefined && room_id === message.name){
if(message.status === 'on'){
$(this).find('img').attr('src', 'images/online-icon.png');
}else {
$(this).find('img').attr('src', 'images/offline-icon.png');
}
}
});
}
}
$('#main').delegate('a.ajax-modal', 'click', function() {
event.preventDefault();
var user_id = $(this).attr('user-id');
if(user_id !== undefined && user_id !== RTCApp.name)
RTCApp.commChannel.callOtherParty(user_id);
});
$('#main').delegate('a.ajax-room-modal', 'click', function() {
event.preventDefault();
var room = $(this).attr('user-id');
RTCApp.commChannel.joinRoom(room);
});
$.ajaxSetup({
'beforeSend' : function(xhr) {
xhr.overrideMimeType('text/html; charset=ISO-8859-1');
},
});
window.onbeforeunload = function() {
if(RTCApp.commChannel !== null)
RTCApp.commChannel.sendPresence(RTCApp.name, 'off');
}
function addNewUser(jsonData, class_name, class_div){
users[jsonData.id] = jsonData;
$('.people-carousel').empty();
var array = $.map(users, function (value, key) { return value; });
addDataToDiv(array, class_name, class_div, false);
}
function loadFromJSON(file, class_name, class_div, roomFlag){
$.getJSON(file, function(data) {
addDataToDiv(data, class_name, class_div, roomFlag);
});
}
function roster(message){
addDataToDiv(message.people, "ajax-modal", ".people-carousel", false);
addDataToDiv(message.rooms, "ajax-room-modal", ".rooms-carousel", true);
if(message.people.length > 0)
$('#people_content').show();
if(message.rooms.length > 0)
$('#room_content').show();
if(users[RTCApp.name] === undefined){
console.log('user not known by the system, create an avatar');
addNewUser({
"name" : RTCApp.name,
"id": RTCApp.name,
"img" : "images/person.jpg"
}, "ajax-modal", ".people-carousel");
}
if(users[RTCApp.name].room !== undefined){
for(var i=0; i < users[RTCApp.name].room.length; i ++)
RTCApp.commChannel.joinRoom(users[RTCApp.name].room[i]);
}
}
function addDataToDiv(data, class_name, class_div, roomFlag){
var items = [];
var i = 0;
var groupIndex = 12;
$.each(data, function(key, value) {
var name = this.name;
var image = this.img;
var id = this.id;
if(!roomFlag)
users[id] = value;
if(i % groupIndex === 0){
if(i === 0)
items.push('<div class="item active">');
else
items.push('<div class="item">');
items.push('<ul class="thumbnails">');
}
items.push('<li class="span1"><div class="thumbnail"><img src="' + image
+' " alt=""></a> <h4>' + name + '</h4><p><a href="#" class="btn btn-primary ' +
class_name + ' " user-id="' + id +
'" >Talk<img src="images/offline-icon.png" width="24" height="24" align="left" alt=""> </a></p></div></li>');
if( (i % groupIndex) === (groupIndex - 1) ){
items.push('</ul>');
items.push('</div>');
}
i++;
});
if(items.lenght > 0 && items[items.lenght - 1].indexOf('div') < 0 ){
items.push('</ul>');
items.push('</div>');
}
$(items.join('')).appendTo(class_div);
}
setInterval(function(){
for(newUser in newUsers){
if(newUsers[newUser]){
$('#userTitle').text('Accept a new user?');
$('#callerUser').text('User id '+ newUser);
$('#userModal').modal('show');
break;
}
}
}, 10000);