[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#768933: marked as done (unblock: jscommunicator)



Your message dated Fri, 21 Nov 2014 20:37:26 +0100
with message-id <546F9476.2010905@thykier.net>
and subject line Re: Bug#768933: unblock: jscommunicator
has caused the Debian Bug report #768933,
regarding unblock: jscommunicator
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
768933: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=768933
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org

Bugs:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=768363
   - this corrects the version in the constraint to depend on
fonts-font-awesome 4.1.0~dfsg
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=768632
   - this ensures compatibility with older versions of jQuery found in
Debian / drupal7 package


This is a new upstream release (from 1.1.1 to 2.0.1).  WebRTC is a fast
moving technology and it is in the best interests of users to offer the
latest version of the package.  Browser vendors assure

This package has not been updated in unstable for a few months because
related dependencies were in the FTP new queue
(drupal7-mod-jqueryi18nproperties and drupal7-mod-fontawesome) until
just before the freeze and so I have only been able to test all these
packages together as a set over the last few days.  If I had uploaded
earlier it would have broken the drucall package.

There will also be an unblock request for drupal7-mod-drucall which is
based on jscommunicator


--- jscommunicator-1.1.1/debian/changelog       2014-02-12
16:08:06.000000000 +0100
+++ jscommunicator-2.0.1/debian/changelog       2014-11-08
22:18:54.000000000 +0100
@@ -1,3 +1,22 @@
+jscommunicator (2.0.1-1) unstable; urgency=medium
+
+  * New upstream release.
+  * Support for older jQuery versions. (Closes: #768632)
+
+ -- Daniel Pocock <daniel@pocock.pro>  Sat, 08 Nov 2014 22:17:56 +0100
+
+jscommunicator (2.0.0-2) unstable; urgency=medium
+
+  * Relax fonts-font-awesome dependency version. (Closes: #768363)
+
+ -- Daniel Pocock <daniel@pocock.pro>  Thu, 06 Nov 2014 20:44:01 +0100
+
+jscommunicator (2.0.0-1) unstable; urgency=medium
+
+  * New upstream release.
+
+ -- Daniel Pocock <daniel@pocock.pro>  Wed, 05 Nov 2014 22:07:58 +0100
+
 jscommunicator (1.1.1-1) unstable; urgency=low

   * New upstream release

diff -Nru jscommunicator-1.1.1/AUTHORS jscommunicator-2.0.1/AUTHORS
--- jscommunicator-1.1.1/AUTHORS	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/AUTHORS	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,12 @@
+Daniel Pocock <danielpocock.com>
+Juliana Louback <julianalouback.com>
+Christian Henz <github.com/chenz>
+Jeroen Massar <jeroen.massar.ch>
+elprincipe <github.com/elprincipe>
+Yehuda Korotkin <github.com/yedako>
+Carla Araos <carlaaraos.com>
+aavia <github.com/aavia>
+mirazusman <github.com/mirazusman>
+tehilazi <github.com/tehilazi>
+Matías A. Bellone <github.com/toote>
+tami4 <github.com/tami4>
diff -Nru jscommunicator-1.1.1/available_languages.xml jscommunicator-2.0.1/available_languages.xml
--- jscommunicator-1.1.1/available_languages.xml	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/available_languages.xml	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<list>
+<language>
+    <display>Български</display>
+    <code>bg</code>
+</language>
+<language>
+    <display>Deutsch</display>
+    <code>de</code>
+</language>
+<language>
+    <display>English</display>
+    <code>en</code>
+</language>
+<language>
+    <display>Español</display>
+    <code>es</code>
+</language>
+<language>
+    <display>Français</display>
+    <code>fr</code>
+</language>
+<language>
+    <display>עברית</display>
+    <code>he</code>
+</language>
+<language>
+    <display>Polski</display>
+    <code>pl</code>
+</language>
+<language>
+    <display>Português</display>
+    <code>pt</code>
+</language>
+<language>
+    <display>slovenčina</display>
+    <code>sk</code>
+</language>
+</list>
diff -Nru jscommunicator-1.1.1/code_grabber jscommunicator-2.0.1/code_grabber
--- jscommunicator-1.1.1/code_grabber	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/code_grabber	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+wget http://code.jquery.com/jquery-1.7.2.min.js -O jquery.js
+wget https://freephonebox.net/JsSIP.js -O JsSIP.js
+wget http://arbiterjs.com/Arbiter.js -O Arbiter.js
+wget https://jquery-i18n-properties.googlecode.com/files/jquery.i18n.properties-min-1.0.9.js -O jquery.i18n.properties.js
+
+mkdir -p font-awesome/css
+mkdir -p font-awesome/fonts 
+
+mkdir -p temp
+wget -P temp http://jqueryui.com/resources/download/jquery-ui-1.10.4.zip
+unzip -d temp temp/jquery-ui-1.10.4.zip
+cp temp/jquery-ui-1.10.4/js/jquery-ui-1.10.4.min.js jquery-ui.js 
+cp temp/jquery-ui-1.10.4/css/ui-lightness/jquery-ui-1.10.4.css jquery-ui.css
+
+wget -P temp http://fortawesome.github.io/Font-Awesome/assets/font-awesome-4.1.0.zip
+unzip -d temp temp/font-awesome-4.1.0.zip
+cp temp/font-awesome-4.1.0/css/font-awesome.min.css font-awesome/css/font-awesome.min.css
+cp -a temp/font-awesome-4.1.0/fonts/. font-awesome/fonts
+rm -r temp
diff -Nru jscommunicator-1.1.1/config-sample.js jscommunicator-2.0.1/config-sample.js
--- jscommunicator-1.1.1/config-sample.js	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/config-sample.js	2014-11-08 20:03:43.000000000 +0100
@@ -16,7 +16,7 @@
   websocket: {
     servers: 'wss://ws1.example.org',
     connection_recovery_min_interval: 2,
-    connection_recovery_max_interval: 30,
+    connection_recovery_max_interval: 30
   },
 
   // User identity
@@ -29,7 +29,7 @@
     uri: 'sip:bob@example.org',
     sip_auth_user: 'bob',
     sip_auth_password: 'bob',
-    sip_auth_user_full_uri: true,   // Whether to use full URI or just 
+    sip_auth_user_full_uri: true    // Whether to use full URI or just
                                     // the user part to construct the auth user
   },
 
@@ -38,14 +38,14 @@
     on_startup: true,          // Register when websocket link starts?
     expiry: 3600,              // Registration expiry (seconds)
     user_control: false,        // Show button for user to (de)register
-    server: null,              // Registration server
+    server: null               // Registration server
   },
 
   dialing : {
     auto_dial : {
       default_destination : 'alice',  // A name or full URI
       on_startup: false,           // Whether to wait for user to click dial
-      use_video: true,            // Whether to auto-dial with video
+      use_video: true             // Whether to auto-dial with video
     },
     edit_destination: true,      // Whether the user may edit the destination
     show_destination: true,      // Whether the user can see the destination
@@ -53,11 +53,18 @@
     video_dialing: true,         // Whether to offer a video call button
     prefer_video: false,         // If user presses Enter to dial, use video?
     no_answer_timeout: 60,       // How long to wait for answer (seconds)
+    clear_dialbox: false         // Whether to clear dialbox after call/attempted call
+  },
+
+  chat : {
+    enable: true                 // Whether to show chat functions
   },
 
   session : {
     show_dtmf_pad : true,        // Whether to show a DTMF dialpad during calls
     dtmf_duration : 160,         // Duration (ms) to signal a DTMF press
+    dialpad_tone: true,          // Whether to play sound after pressing dialpad button
+    message_tone: true,          // Whether to alert (sound) when new IM is received
     require_relay_candidate: false  // Whether to abort calls if no
                                     // relay candidate found in the SDP
                                     // generated by the browser.
@@ -65,10 +72,16 @@
                                     // the lack of a relay candidate is
                                     // likely to be a sign that UDP is blocked
   },
+    
+  i18n : {
+    translate: true,     // enables the call to i18n init function from JSCommManager.init()
+    show_menu: true,    // show the language chooser menu
+    default_lang: 'en'    // default language to use
+  },
 
   extra_headers : [
     // 'X-WS-Session-Extra: some_token=value'
-  ],
+  ]
 
 };
 
@@ -78,6 +91,7 @@
  http://jscommunicator.org
 
  Copyright (C) 2013  Daniel Pocock http://danielpocock.com
+ Copyright (C) 2014  Juliana Louback http://julianalouback.com
 
  The JavaScript code in this page is free software: you can
  redistribute it and/or modify it under the terms of the GNU
diff -Nru jscommunicator-1.1.1/debian/changelog jscommunicator-2.0.1/debian/changelog
--- jscommunicator-1.1.1/debian/changelog	2014-02-12 16:08:06.000000000 +0100
+++ jscommunicator-2.0.1/debian/changelog	2014-11-08 22:18:54.000000000 +0100
@@ -1,3 +1,22 @@
+jscommunicator (2.0.1-1) unstable; urgency=medium
+
+  * New upstream release.
+  * Support for older jQuery versions. (Closes: #768632)
+
+ -- Daniel Pocock <daniel@pocock.pro>  Sat, 08 Nov 2014 22:17:56 +0100
+
+jscommunicator (2.0.0-2) unstable; urgency=medium
+
+  * Relax fonts-font-awesome dependency version. (Closes: #768363)
+
+ -- Daniel Pocock <daniel@pocock.pro>  Thu, 06 Nov 2014 20:44:01 +0100
+
+jscommunicator (2.0.0-1) unstable; urgency=medium
+
+  * New upstream release.
+
+ -- Daniel Pocock <daniel@pocock.pro>  Wed, 05 Nov 2014 22:07:58 +0100
+
 jscommunicator (1.1.1-1) unstable; urgency=low
 
   * New upstream release
diff -Nru jscommunicator-1.1.1/debian/control jscommunicator-2.0.1/debian/control
--- jscommunicator-1.1.1/debian/control	2014-02-04 20:21:20.000000000 +0100
+++ jscommunicator-2.0.1/debian/control	2014-11-06 20:42:50.000000000 +0100
@@ -2,9 +2,9 @@
 Section: web
 Priority: optional
 Maintainer: Debian Javascript Maintainers <pkg-javascript-devel@lists.alioth.debian.org>
-Uploaders: Daniel Pocock <daniel@pocock.com.au>
+Uploaders: Daniel Pocock <daniel@pocock.pro>
 Build-Depends: debhelper (>= 9), closure-compiler
-Standards-Version: 3.9.5
+Standards-Version: 3.9.6
 Homepage: http://jscommunicator.org
 Vcs-Browser: http://git.debian.org/?p=pkg-javascript/jscommunicator.git
 Vcs-Git: git://git.debian.org/git/pkg-javascript/jscommunicator.git
@@ -12,8 +12,9 @@
 Package: libjs-jscommunicator
 Architecture: all
 Multi-Arch: foreign
-Depends: ${misc:Depends}, libjs-jquery, libjs-jssip, libjs-arbiter
+Depends: ${misc:Depends}, libjs-jquery, libjs-jquery-ui, libjs-jssip, libjs-arbiter, libjs-jquery-i18n-properties, fonts-font-awesome (>= 4.1.0~dfsg)
 Recommends: javascript-common
+Breaks: drupal7-mod-jscommunicator (<< 1.0.1-2)
 Description: Browser-based messaging, phone and video chat application
  HTML5 SIP client entirely written in JavaScript for integration in
  any web site, incude a blog, CMS or web application.  Requires
diff -Nru jscommunicator-1.1.1/debian/copyright jscommunicator-2.0.1/debian/copyright
--- jscommunicator-1.1.1/debian/copyright	2014-01-19 10:56:48.000000000 +0100
+++ jscommunicator-2.0.1/debian/copyright	2014-11-05 22:09:49.000000000 +0100
@@ -3,7 +3,8 @@
 Source: http://jscommunicator.org
 
 Files: *
-Copyright: 2013, Daniel Pocock http://danielpocock.com
+Copyright: 2013-2014, Daniel Pocock http://danielpocock.com
+           2014, Juliana Louback http://julianalouback.com
 License: GPL-2+
 
 Files: parseuri.js
diff -Nru jscommunicator-1.1.1/debian/jscommunicator-web-phone.links jscommunicator-2.0.1/debian/jscommunicator-web-phone.links
--- jscommunicator-1.1.1/debian/jscommunicator-web-phone.links	2014-02-04 20:25:06.000000000 +0100
+++ jscommunicator-2.0.1/debian/jscommunicator-web-phone.links	2014-11-05 22:35:15.000000000 +0100
@@ -2,7 +2,14 @@
 /usr/share/jscommunicator/jscommunicator.inc	usr/share/jscommunicator-web-phone/jscommunicator.inc
 /usr/share/jscommunicator/style.css	usr/share/jscommunicator-web-phone/style.css
 /usr/share/jscommunicator/sounds	usr/share/jscommunicator-web-phone/sounds
+/usr/share/jscommunicator/available_languages.xml	usr/share/jscommunicator-web-phone/available_languages.xml
+/usr/share/jscommunicator/internationalization	usr/share/jscommunicator-web-phone/internationalization
+/usr/share/jscommunicator/skin.css	usr/share/jscommunicator-web-phone/skin.css
 /usr/share/javascript/jssip/JsSIP.min.js	usr/share/jscommunicator-web-phone/JsSIP.js
 /usr/share/javascript/jquery/jquery.min.js	usr/share/jscommunicator-web-phone/jquery.js
 /usr/share/javascript/arbiter/Arbiter.js	usr/share/jscommunicator-web-phone/Arbiter.js
+/usr/share/javascript/jquery-i18n-properties/jquery.i18n.properties-min.js	usr/share/jscommunicator-web-phone/jquery.i18n.properties.js
+/usr/share/javascript/jquery-ui/jquery-ui.min.js	usr/share/jscommunicator-web-phone/jquery-ui.min.js
+/usr/share/javascript/jquery-ui/css/smoothness/jquery-ui.min.css	usr/share/jscommunicator-web-phone/jquery-ui.css
+/usr/share/fonts-font-awesome	usr/share/jscommunicator-web-phone/font-awesome
 /etc/jscommunicator-web-phone/config.js	usr/share/jscommunicator-web-phone/config.js
diff -Nru jscommunicator-1.1.1/debian/libjs-jscommunicator.docs jscommunicator-2.0.1/debian/libjs-jscommunicator.docs
--- jscommunicator-1.1.1/debian/libjs-jscommunicator.docs	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/debian/libjs-jscommunicator.docs	2014-11-05 22:17:36.000000000 +0100
@@ -0,0 +1 @@
+INTERNATIONALIZATION_README.txt
diff -Nru jscommunicator-1.1.1/debian/libjs-jscommunicator.install jscommunicator-2.0.1/debian/libjs-jscommunicator.install
--- jscommunicator-1.1.1/debian/libjs-jscommunicator.install	2014-01-19 10:56:48.000000000 +0100
+++ jscommunicator-2.0.1/debian/libjs-jscommunicator.install	2014-11-05 22:16:18.000000000 +0100
@@ -3,3 +3,6 @@
 style.css	/usr/share/jscommunicator
 sounds	/usr/share/jscommunicator
 config-sample.js	/usr/share/doc/libjs-jscommunicator
+available_languages.xml	/usr/share/jscommunicator
+internationalization	/usr/share/jscommunicator
+skin.css	/usr/share/jscommunicator
diff -Nru jscommunicator-1.1.1/debian/README.source jscommunicator-2.0.1/debian/README.source
--- jscommunicator-1.1.1/debian/README.source	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/debian/README.source	2014-09-11 14:26:59.000000000 +0200
@@ -0,0 +1,7 @@
+
+Contributions from other developers are welcome.
+
+Just join pkg-javascript-devel and make sure any changes you make
+are pushed into the Git repository on alioth before you
+upload/NMU.
+
diff -Nru jscommunicator-1.1.1/deb-setup.sh jscommunicator-2.0.1/deb-setup.sh
--- jscommunicator-1.1.1/deb-setup.sh	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/deb-setup.sh	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# Use apt-get to install all the dependency packages:
+
+# sudo apt-get install \
+#   libjs-jquery libjs-arbiter libjs-jquery-i18n-properties \
+#   libjs-jquery-ui libjs-jssip fonts-font-awesome
+
+# create symlinks to the artifacts provided by the packages:
+
+ln -s /usr/share/javascript/jquery/jquery.min.js jquery.js
+ln -s /usr/share/javascript/arbiter/Arbiter.js .
+ln -s /usr/share/javascript/jquery-i18n-properties/jquery.i18n.properties-min.js jquery.i18n.properties.js
+ln -s /usr/share/javascript/jquery-ui/jquery-ui.min.js jquery-ui.js
+ln -s /usr/share/javascript/jquery-ui/css/smoothness/jquery-ui.min.css jquery-ui.css
+ln -s /usr/share/javascript/jssip/JsSIP.min.js JsSIP.js
+ln -s /usr/share/fonts-font-awesome font-awesome
+
+
diff -Nru jscommunicator-1.1.1/event-demo.js jscommunicator-2.0.1/event-demo.js
--- jscommunicator-1.1.1/event-demo.js	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/event-demo.js	2014-11-08 20:03:43.000000000 +0100
@@ -3,6 +3,7 @@
  http://jscommunicator.org
 
  Copyright (C) 2014  Daniel Pocock http://danielpocock.com
+ Copyright (C) 2014  Juliana Louback http://julianalouback.com
 
  The JavaScript code in this page is free software: you can
  redistribute it and/or modify it under the terms of the GNU
@@ -30,6 +31,9 @@
 
   var logEvent = function(event_name, data) {
     var now = new Date().toLocaleTimeString();
+    if(data.length > 1) {
+      data = "<a href=\"#\" onclick=\"JSCommManager.make_call('".concat(data,"');\">",data,"</a>");
+    }
     $("#event-demo-log").append("<tr><td>" + now + "</td><td>" + event_name + "</td><td>" + data + "</td></tr>");
   };
 
diff -Nru jscommunicator-1.1.1/event-demo.shtml jscommunicator-2.0.1/event-demo.shtml
--- jscommunicator-1.1.1/event-demo.shtml	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/event-demo.shtml	2014-11-08 20:03:43.000000000 +0100
@@ -1,11 +1,17 @@
 <!DOCTYPE html>
 <head>
+<meta charset="utf-8"/>
 <title>Testing</title>
 <link rel="stylesheet" href="style.css" type="text/css"/>
 <link rel="stylesheet" href="style-horizontal.css" type="text/css"/>
 <link rel="stylesheet" href="style-event-demo.css" type="text/css"/>
+<link rel="stylesheet" href="skin.css" type="text/css"/>
 <script src="jquery.js" type="text/javascript"></script>
 <script src="Arbiter.js" type="text/javascript"></script>
+<script src="jquery.i18n.properties.js" type="text/javascript"></script>
+<!-- For resizeable webcam display -->
+<script src="jquery-ui.js"></script>
+<link rel="stylesheet" href="jquery-ui.css" type="text/css"/>
 <!--<script src="http://jssip.net/download/jssip-devel.js";></script>-->
 <script src="JsSIP.js" type="text/javascript"></script>
 <script src="init.js" type="text/javascript"></script>
@@ -16,11 +22,11 @@
 
 <!-- The event demo logic -->
 <script src="event-demo.js" type="text/javascript"></script>
+<!--font-->
+<link rel="stylesheet" href="font-awesome/css/font-awesome.min.css">
 </head>
 <body>
 
-<h1>JSCommunicator</h1>
-
 <!-- To make this work, you must
        a) have mod_include enabled in Apache (on Debian: a2enmod include)
        b) have a Directory element in your server configuration
diff -Nru jscommunicator-1.1.1/.gitignore jscommunicator-2.0.1/.gitignore
--- jscommunicator-1.1.1/.gitignore	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/.gitignore	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,7 @@
+jquery.i18n.properties.js
+Arbiter.js
+JsSIP.js
+config.js
+jquery-ui.css
+jquery-ui.js
+jquery.js
diff -Nru jscommunicator-1.1.1/i18n.js jscommunicator-2.0.1/i18n.js
--- jscommunicator-1.1.1/i18n.js	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/i18n.js	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,276 @@
+/****************************************************************************
+ JSCommunicator
+ http://jscommunicator.org
+
+ Copyright (C) 2014  Kengne Mabou Hervé Frantz https://github.com/elprincipe
+ Copyright (C) 2014  Juliana Louback http://julianalouback.com
+
+ The JavaScript code in this page is free software: you can
+ redistribute it and/or modify it under the terms of the GNU
+ General Public License (GNU GPL) as published by the Free Software
+ Foundation, either version 2 of the License, or (at your option)
+ any later version.  The code is distributed WITHOUT ANY WARRANTY;
+ without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
+
+ You may distribute non-source (e.g., minimized or compacted) forms of
+ that code without the full copy of the GNU GPL normally required
+ provided you include this license notice and a URL
+ through which recipients can access the Corresponding Source.
+****************************************************************************/
+
+(function ($) {
+
+window.i18n = {
+      	// load I18N bundles
+    initI18n : function(show_menu) {
+
+        url_prefix = '';
+        if(JSCommSettings.webserver) {
+            if(JSCommSettings.webserver.url_prefix) {
+                url_prefix = JSCommSettings.webserver.url_prefix;
+            }
+        }
+
+        if(JSCommSettings.i18n.default_lang) {
+            try {
+                i18n.loadBundles(url_prefix, JSCommSettings.i18n.default_lang);
+            } catch (error) {}
+        }
+        else {
+            try {
+                i18n.loadBundles(url_prefix, jQuery.i18n.browserLang());
+            } catch (error) {}
+        }
+
+ 
+        if(show_menu) {
+          $("#lang_selection").show();
+          $.ajax({
+             type:"GET",
+             url: url_prefix + "available_languages.xml",
+             dataType: "xml",
+             success: function(xml) {
+             $(xml).find("language").each(function() {
+                  var display = $(this).find('display').text();
+                  var value = $(this).find('code').text();
+                  $('#lang_selection').append('<option value=' +value+ '>' +display+ '</option>');
+                  });
+             }
+             });
+
+            // configure language combo box
+            jQuery('#lang_selection').change(function() {
+                var selection = $(this).val();
+                i18n.loadBundles(url_prefix, selection != 'lang_selection' ? selection : null);
+            });
+        }
+        else {
+            $("#lang_selection").hide();
+        }
+    },
+ 
+		
+    loadBundles : function (url_prefix, lang) {
+			jQuery.i18n.properties({
+			    name:'Messages', 
+			    path: url_prefix + 'internationalization/',
+			    mode:'both',
+			    language:lang, 
+			    callback: function() {
+			        i18n.internationalize();
+			    }
+			});
+		},
+		
+    internationalize : function () {
+			// Accessing values through the map
+				var msg1 = 'error_js';
+				var msg2 = 'error_webrtc';
+				var msg3 = 'error_no_config';
+				var msg4 = 'error_ua_init_failure';
+				var msg5 = 'error_reg_fail';
+				var msg6 = 'error_call_attempt_failed';
+				var msg7 = 'error_dynamic';
+				var msg8 = 'jsc_login_display_name';
+				var msg9 = 'jsc_login_sip_uri';
+				var msg10 = 'jsc_login_password';
+				var msg11 = 'jsc_login_button';
+				var msg12 = 'ws_link';
+				var msg13 = 'ws_state_connected';
+				var msg14 = 'ws_state_disconnected';
+				var msg15 = 'sip_reg';
+				var msg16 = 'sip_reg_up';
+				var msg17 = 'sip_reg_down';
+				var msg18 = 'sip_dest_address';
+				var msg19 = 'session_state_outgoing';
+				var msg20 = 'session_state_incoming';
+				var msg21 = 'session_state_accepted';
+				var msg22 = 'session_state_active';
+				var msg23 = 'button_session_cancel';
+				var msg24 = 'button_session_reject';
+				var msg25 = 'button_session_answer';
+				var msg26 = 'button_call_audio';
+				var msg27 = 'button_reg';
+				var msg28 = 'button_dereg';
+				var msg29 = 'button_call_audio_video';
+				var msg30 = 'button_session_answer_video';
+				var msg31 = 'button_session_answer_hold';
+				var msg32 = 'button_session_answer_hang_up';
+				var msg33 = 'button_video_control_self_view';
+				var msg34 = 'button_video_control_self_hide';
+				var msg35 = 'button_video_control_full_screen';
+				var msg36 = 'welcome';
+				var msg37 = 'call';
+				var msg38 = 'chat';
+				var msg39 = 'enter_contact';
+				var msg40 = 'type_to_chat';
+				var msg41 = 'start_chat';
+				var msg42 = 'me';
+				var msg43 = 'logout';
+				var msg44 = 'no_contact';
+				var msg45 = 'remember_me';
+            
+			jQuery('#error #js')
+				.empty()
+				.append(jQuery.i18n.prop(msg1));
+
+			jQuery('#error #webrtc')
+				.empty()
+				.append(jQuery.i18n.prop(msg2));
+
+			jQuery('#error #no-config')
+				.empty()
+				.append(jQuery.i18n.prop(msg3));
+
+			jQuery('#error #ua-init-failure')
+				.empty()
+				.append(jQuery.i18n.prop(msg4));
+
+			jQuery('#error #reg-fail')
+				.empty()
+				.append(jQuery.i18n.prop(msg5));
+
+			jQuery('#error #call-attempt-failed')
+				.empty()
+				.append(jQuery.i18n.prop(msg6));
+
+			jQuery('#error #dynamic')
+				.empty()
+				.append(jQuery.i18n.prop(msg7));
+
+			jQuery('#jsc-login-display-name .jsc-login-label')
+				.empty()
+				.append(jQuery.i18n.prop(msg8));
+
+			jQuery('#jsc-login-sip-uri .jsc-login-label')
+				.empty()
+				.append(jQuery.i18n.prop(msg9));
+
+			jQuery('#jsc-login-password .jsc-login-label')
+				.empty()
+				.append(jQuery.i18n.prop(msg10));
+
+			jQuery('#jsc-login-button')
+				.val(jQuery.i18n.prop(msg11)).change();
+
+			jQuery('#ws #ws_link')
+				.empty()
+				.append(jQuery.i18n.prop(msg12));
+
+			jQuery('#ws #connected')
+				.empty()
+				.append(jQuery.i18n.prop(msg13));
+
+			jQuery('#ws #disconnected')
+				.empty()
+				.append(jQuery.i18n.prop(msg14));
+
+			jQuery('#reg #reg-label')
+				.empty()
+				.append(jQuery.i18n.prop(msg15));
+
+			jQuery('#reg #state .up')
+				.empty()
+				.append(jQuery.i18n.prop(msg16));
+
+			jQuery('#reg #state .down')
+				.empty()
+				.append(jQuery.i18n.prop(msg17));
+
+			jQuery('#control #reg-button')
+				.val(jQuery.i18n.prop(msg27)).change();
+
+			jQuery('#control #de-reg-button')
+				.val(jQuery.i18n.prop(msg28)).change();
+
+
+			jQuery('#dial-controls #dest #dest_label')
+				.empty()
+				.append(jQuery.i18n.prop(msg18));
+
+			jQuery('#chat #new-chat #chat_dest_label')
+				.empty()
+				.append(jQuery.i18n.prop(msg18));
+
+			jQuery('#dial-controls #dialing-actions #call-audio').attr("title", jQuery.i18n.prop(msg26));
+			
+			jQuery('#dial-controls #dialing-actions #call-video').attr("title", jQuery.i18n.prop(msg29));
+
+			jQuery('#session-controls #state .session-outgoing')
+				.val(jQuery.i18n.prop(msg19)).change();
+
+			jQuery('#session-controls #state .session-incoming')
+				.val(jQuery.i18n.prop(msg20)).change();
+		
+			jQuery('#session-controls #state .session-accepted')
+				.val(jQuery.i18n.prop(msg20)).change();
+
+			jQuery('#session-controls #state .session-active')
+				.val(jQuery.i18n.prop(msg22)).change();
+
+			jQuery('#session-actions #session-cancel').attr("title", jQuery.i18n.prop(msg23));
+
+			jQuery('#session-actions #session-reject').attr("title", jQuery.i18n.prop(msg24));
+
+			jQuery('#session-actions #session-answer').attr("title", jQuery.i18n.prop(msg25));
+
+			jQuery('#session-actions #session-answer-video').attr("title", jQuery.i18n.prop(msg30));
+
+			/*jQuery('#peer #session-actions #session-hold')
+				.val(jQuery.i18n.prop(msg31)).change();*/
+
+			jQuery('#session-actions #session-hangup').attr("title", jQuery.i18n.prop(msg32));
+
+			jQuery('#video-session #video-controls #video-control-self-view')
+				.val(jQuery.i18n.prop(msg33)).change();
+
+			jQuery('#video-session #video-controls #video-control-self-hide')
+				.val(jQuery.i18n.prop(msg34)).change();
+
+			jQuery('#video-session #video-controls #video-control-fullscreen')
+				.val(jQuery.i18n.prop(msg35)).change();
+
+			jQuery('#welcome').text(jQuery.i18n.prop(msg36));		
+
+			jQuery('#call h3').text(jQuery.i18n.prop(msg37));
+
+			jQuery('#chat h3').text(jQuery.i18n.prop(msg38));
+
+			jQuery('#address').attr("placeholder", jQuery.i18n.prop(msg39));
+
+			jQuery('#chat-address').attr("placeholder", jQuery.i18n.prop(msg39));
+
+			jQuery('.inactive').attr("placeholder", jQuery.i18n.prop(msg40));
+
+			jQuery('#start-chat').attr("title", jQuery.i18n.prop(msg41));
+
+			jQuery('#jsc-logout-button').attr("title", jQuery.i18n.prop(msg43));
+
+			jQuery('.no-contact').text(jQuery.i18n.prop(msg44));
+
+			jQuery('#remember-label').text(jQuery.i18n.prop(msg45));
+	
+		}
+};
+})(jQuery);
diff -Nru jscommunicator-1.1.1/internationalization/Messages_bg.properties jscommunicator-2.0.1/internationalization/Messages_bg.properties
--- jscommunicator-1.1.1/internationalization/Messages_bg.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_bg.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js = ГРЕШКА: Тази услуга изисква JavaScript.  Моля активирайте JavaScript в настройките на Вашия браузър.
+error_webrtc = ГРЕШКА: Тази услуга изисква WebRTC.  Моля опитайте с <a href="http://www.mozilla.org";>Mozilla Firefox</a> или <a href="http://www.google.com/chrome";>Google Chrome</a>, използването на последна версия на браузъра е препорачително.
+error_no_config = ГРЕШКА: JsCommunicator конфигурация не е намерена.
+error_ua_init_failure = ГРЕШКА: Неуспешно стартиране на телефона.
+error_reg_fail = ГРЕШКА: Неуспешна SIP регистрация.
+error_call_attempt_failed = ГРЕШКА: Неуспешно обаждане, проверете дали микрофона и камерата са свързани, проверете настройките за сигурност на браузъра. Възможно е също другата страна да не поддържа съвместими кодеци.
+error_dynamic = " "
+jsc_login_display_name = Публично име (може да бъде празно)
+jsc_login_sip_uri = SIP адрес
+jsc_login_password = Парола
+jsc_login_button = Вход
+ws_link = WebSocket връзка:
+ws_state_connected = Свързан
+ws_state_disconnected = Несвързан
+sip_reg = SIP регистрация:
+sip_reg_up = Регистриран
+sip_reg_down = Нерегистриран
+sip_dest_address = Адрес на получателя
+session_state_outgoing = Набиране ...
+session_state_incoming = Входящо обаждане
+session_state_accepted = Обаждане, проверка на връзката ...
+session_state_active = Осъществено обаждане
+button_session_cancel = Затвори
+button_session_reject = Затвори
+button_session_answer = Обаждане
+button_call_audio = Обаждане (само глас)
+button_reg = Регистрация
+button_dereg = Отписване
+button_call_audio_video = Обаждане (аудио и видео)
+button_session_answer_video = Вдигни (с видео)
+button_session_answer_hold = Задръж
+button_session_answer_hang_up = Затвори
+button_video_control_self_view = Покажи себе си
+button_video_control_self_hide = Скрий себе си
+button_video_control_full_screen = Цял екран
+welcome = Добре дошли, 
+call = Обаждане
+chat = Чат
+enter_contact = Въведете контакт
+type_to_chat = Въведете за започване на чат...
+start_chat = започни чат
+me = аз:
+logout = Изход
+no_contact = Моля въведете контакт.
+remember_me = Запомни ме
\ No newline at end of file
diff -Nru jscommunicator-1.1.1/internationalization/Messages_de.properties jscommunicator-2.0.1/internationalization/Messages_de.properties
--- jscommunicator-1.1.1/internationalization/Messages_de.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_de.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,46 @@
+error_js = FEHLER: Dieser Dienst erfordert JavaScript. Bitte aktivieren Sie JavaScript in Ihren Browsereinstellungen.
+error_webrtc = FEHLER: Dieser Dienst erfordert WebRTC. Bitte versuchen Sie es mit <a href="http://www.mozilla.org";>Mozilla Firefox</a> oder <a href="http://www.google.com/chrome";>Google Chrome</a>. Es ist empfohlen, die jeweils neueste Version zu verwenden.
+error_no_config = FEHLER: JsCommunicator-Konfiguration wurde nicht gefunden.
+error_ua_init_failure = FEHLER: Der User-Agent konnte nicht initialisiert werden.
+error_reg_fail = FEHLER: SIP-Registrierung fehlgeschlagen.
+error_call_attempt_failed = FEHLER: Start des Anrufs fehlgeschlagen. Stellen Sie sicher, dass Mikrofon und Webcam verbunden sind, und prüfen Sie die Browsereinstellungen. Eventuell unterstützt Ihr Gegenüber auch die erforderlichen Codecs nicht.
+error_dynamic = " "
+jsc_login_display_name = Angezeigter Name (kann leer sein)
+jsc_login_sip_uri = SIP-Adresse
+jsc_login_password = Passwort
+jsc_login_button = Login
+ws_link = WebSocket-Link:
+ws_state_connected = Verbunden
+ws_state_disconnected = Nicht verbunden
+sip_reg = SIP-Registrierung:
+sip_reg_up = Registriert
+sip_reg_down = Nicht registriert
+sip_dest_address = Ziel
+session_state_outgoing = Wähle ...
+session_state_incoming = Eingehender Anruf
+session_state_accepted = Antworte, prüfe Verbindung ...
+session_state_active = Anrufer verbunden
+button_session_cancel = Abbrechen
+button_session_reject = Abweisen
+button_session_answer = Antworten
+button_call_audio = Anrufen (nur Ton)
+button_reg = Registrieren
+button_dereg = Deregistrieren
+button_call_audio_video = Anrufen (Bild und Ton)
+button_session_answer_video = Antworten (mit Bild)
+button_session_answer_hold = Halten
+button_session_answer_hang_up = Auflegen
+button_video_control_self_view = Selbstansicht
+button_video_control_self_hide = Selbstansicht verstecken
+button_video_control_full_screen = Vollbild
+welcome = Wilkommen,
+call = Anrufen
+chat = Chat
+enter_contact = Kontakt eingeben
+type_to_chat = tippen zum chatten...
+start_chat = Chat anfangen
+me = ich:
+logout = Ausloggen
+no_contact = Bitte ein Kontakt eingeben.
+remember_me = Erinnere mich
+                                                                                 45,1          Bot
diff -Nru jscommunicator-1.1.1/internationalization/Messages_en.properties jscommunicator-2.0.1/internationalization/Messages_en.properties
--- jscommunicator-1.1.1/internationalization/Messages_en.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_en.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js = ERROR: This service requires JavaScript.  Please enable JavaScript in your web browser settings.
+error_webrtc = ERROR: This service requires WebRTC.  Please try <a href="http://www.mozilla.org";>Mozilla Firefox</a> or <a href="http://www.google.com/chrome";>Google Chrome</a>, using the latest version is strongly recommended.
+error_no_config = ERROR: JsCommunicator configuration not found.
+error_ua_init_failure = ERROR: Failed to initialize user agent.
+error_reg_fail = ERROR: SIP Registration failure.
+error_call_attempt_failed = ERROR: Failed to start call, check that microphone/webcam are connected, check browser security settings, peer may not support compatible codecs.
+error_dynamic = " "
+jsc_login_display_name = Display name (may be empty)
+jsc_login_sip_uri = SIP address
+jsc_login_password = Password
+jsc_login_button = Login
+ws_link = WebSocket link:
+ws_state_connected = Connected
+ws_state_disconnected = Disconnected
+sip_reg = SIP registration:
+sip_reg_up = Registered
+sip_reg_down = Not Registered
+sip_dest_address = Destination
+session_state_outgoing = Dialing ...
+session_state_incoming = Incoming call
+session_state_accepted = Answering, connectivity checks in progress ...
+session_state_active = Call connected
+button_session_cancel = Cancel
+button_session_reject = Reject
+button_session_answer = Answer
+button_call_audio = Call (audio only)
+button_reg = Register
+button_dereg = De-Register
+button_call_audio_video = Call (audio and video)
+button_session_answer_video = Answer (with video)
+button_session_answer_hold = Hold
+button_session_answer_hang_up = Hang-up
+button_video_control_self_view = Self view
+button_video_control_self_hide = Self hide
+button_video_control_full_screen = Full screen
+welcome = Welcome, 
+call = Call
+chat = Chat 
+enter_contact = Enter contact
+type_to_chat = type to chat...
+start_chat = start chat
+me = me:
+logout = Logout
+no_contact = Please enter a contact.
+remember_me = Remember me
\ No newline at end of file
diff -Nru jscommunicator-1.1.1/internationalization/Messages_es.properties jscommunicator-2.0.1/internationalization/Messages_es.properties
--- jscommunicator-1.1.1/internationalization/Messages_es.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_es.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js = ERROR: este servicio requiere JavaScript. Habilite JavaScript en las opciones de su navegador.
+error_webrtc = ERROR: Este servicio requiere WebRTC. Utilice el siguiente enlace, <a href="http://www.mozilla.org";>Mozilla Firefox</a> o <a href="http://www.google.com/chrome";>Google Chrome</a>, es recomendable utilizar la versión más reciente.
+error_no_config = ERROR: No se encontró la configuración de JsCommunicator.
+error_ua_init_failure = ERROR: Fallo durante la inicialización del agente.
+error_reg_fail = ERROR: Fallo durante la registración SIP.
+error_call_attempt_failed = ERROR: No se pudo iniciar la llamada. Verifique si el micrófono y/o la cámara están conectados y verifique las opciones de seguridad de su navegador. Es posible que no compartan codecs con el otro usuario.
+error_dynamic = " "
+jsc_login_display_name = Nombre (opcional)
+jsc_login_sip_uri = Dirección SIP
+jsc_login_password = Contraseña
+jsc_login_button = Iniciar sesión
+ws_link = Enlace WebSocket:
+ws_state_connected = Conectado
+ws_state_disconnected = Desconectado
+sip_reg = Registro SIP:
+sip_reg_up = Registrado
+sip_reg_down = No Registrado
+sip_dest_address = Destino
+session_state_outgoing = Marcando ...
+session_state_incoming = Llamada entrante
+session_state_accepted = Conectando, verificaciones de conectividad en progreso ...
+session_state_active = Llamada conectada
+button_session_cancel = Cancelar
+button_session_reject = Rechazar
+button_session_answer = Contestar 
+button_call_audio = Llamar (sólo audio)
+button_reg = Registrar
+button_dereg = Cancelar el registro
+button_call_audio_video = Llamar (audio y video)
+button_session_answer_video = Contestar (con video)
+button_session_answer_hold = Llamada en espera
+button_session_answer_hang_up = Terminar la llamada
+button_video_control_self_view = Vista (propia)
+button_video_control_self_hide = Ocultar (propia)
+button_video_control_full_screen = Pantalla completa 
+welcome = Bienvenido,
+call = Llamada
+chat = Conversar
+enter_contact = Introduce el contacto
+type_to_chat = escribe para hablar...
+start_chat = empezar conversación
+me = yo:
+logout = Salir
+no_contact = Por favor, introduce un contacto.
+remember_me = Recuérdame
diff -Nru jscommunicator-1.1.1/internationalization/Messages_fr.properties jscommunicator-2.0.1/internationalization/Messages_fr.properties
--- jscommunicator-1.1.1/internationalization/Messages_fr.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_fr.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,35 @@
+error_js = ERREUR : Ce service requiert l'activation de JavaScript. Veuillez l'activer dans les paramètres de votre navigateur.
+error_webrtc = ERREUR : Ce service requiert la technologie WebRTC. Veuillez utiliser les navigateurs <a href="http://www.mozilla.org";>Mozilla Firefox</a> ou <a href="http://www.google.com/chrome";>Google Chrome</a>; l'utilisation des dernières versions est vivement recommandée.
+error_no_config = ERREUR : La configuration de JsCommunicator est introuvable.
+error_ua_init_failure = ERREUR : Échec d'initialisation de l'agent utilisateur SIP.
+error_reg_fail = ERREUR : Échec de l'enregistrement SIP.
+error_call_attempt_failed = Échec de lancement de l'appel, veuillez vous assurer que vos webcam et micro sont connectés, vérifiez également les options de sécurité de votre navigateur. Il se peut que votre interlocuteur ne possède pas les codecs compatibles.
+error_dynamic = " "
+jsc_login_display_name = Nom (peut être vide)
+jsc_login_sip_uri = Adresse SIP
+jsc_login_password = Mot de passe
+jsc_login_button = Login
+ws_link = Adresse Websocket :
+ws_state_connected = connecté
+ws_state_disconnected = déconnecté
+sip_reg = Enregistrement SIP :
+sip_reg_up = Enregistré
+sip_reg_down = Non enregistré
+sip_dest_address = Destination
+session_state_outgoing = Numérotation…
+session_state_incoming = Appel entrant
+session_state_accepted = Réponse en cours, test de la connectivité en cours…
+session_state_active = Appel établi
+button_session_cancel = Annuler
+button_session_reject = Rejeter
+button_session_answer = Répondre
+button_call_audio = Appel (audio seulement)
+button_reg = Enregistrer
+button_dereg = Désenregistrer
+button_call_audio_video = Appel (audio et vidéo)
+button_session_answer_video = Répondre (avec vidéo)
+button_session_answer_hold = Décrocher
+button_session_answer_hang_up = Raccrocher
+button_video_control_self_view = Vidéo locale
+button_video_control_self_hide = Cacher la vidéo locale
+button_video_control_full_screen = Plein écran
diff -Nru jscommunicator-1.1.1/internationalization/Messages_he.properties jscommunicator-2.0.1/internationalization/Messages_he.properties
--- jscommunicator-1.1.1/internationalization/Messages_he.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_he.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js =.בהגדרות הדפדפן שלך JavaScript נא אפשר  .JavaScript שגיאה: השירות דורש
+error_webrtc =.שימוש במהדורה האחרונה מומלץ ,<a href="http://www.google.com/chrome";>Google Chrome</a> או <a href="http://www.mozilla.org";>Mozilla Firefox</a> נסה .WebRTC שגיאה: השירות דורש 
+error_no_config =.לא נמצאה JsCommunicator שגיאה: הקונפיגורציה של 
+error_ua_init_failure = שגיאה: נכשל האתחול  user agent.
+error_reg_fail = שגיאה: כישלון רישום SIP.
+error_call_attempt_failed = שגיאה: נכשל ניסיון להתחיל שיחה. לוודא שמיקרופון / מצלמת אינטרנט מחוברים. בדוק את הגדרות אבטחה של דפדפן, peer עשויים שלא לתמוך קודקים תואמים.
+error_dynamic = " "
+jsc_login_display_name = שם תצוגה (יכול להיות ריק)
+jsc_login_sip_uri = כתובת SIP
+jsc_login_password = סיסמה
+jsc_login_button = כניסה
+ws_link = קישור WebSocket:
+ws_state_connected = מחובר
+ws_state_disconnected = מנותק
+sip_reg = SIP registration:
+sip_reg_up = רשום
+sip_reg_down = לא רשום
+sip_dest_address = יעד
+session_state_outgoing = מחייג ...
+session_state_incoming = שיחה נכנסת
+session_state_accepted = עונה, בודק חיבור ...
+session_state_active = שיחה פעילה
+button_session_cancel = ביטול
+button_session_reject = דחייה
+button_session_answer = תשובה
+button_call_audio = (התקשרות (רק שמע 
+button_reg = הרשמה
+button_dereg = בטל הרשמה
+button_call_audio_video = חייג (וידאו וקול)
+button_session_answer_video = (תשובה (עם וידאו
+button_session_answer_hold = השהה
+button_session_answer_hang_up = נתק
+button_video_control_self_view = תצוגה עצמית
+button_video_control_self_hide = הסתרה עצמית
+button_video_control_full_screen = מסך מלא
+welcome = ברוכים הבאים,
+call = שיחה
+chat = צ'ט
+enter_contact = הכנס איש קשר
+type_to_chat = הקלד לצ'ט...
+start_chat = התחל צ'ט
+me = אני:
+logout = התנתק
+no_contact = הזן איש קשר.
+remember_me = זכור אותי
\ No newline at end of file
diff -Nru jscommunicator-1.1.1/internationalization/Messages_nl.properties jscommunicator-2.0.1/internationalization/Messages_nl.properties
--- jscommunicator-1.1.1/internationalization/Messages_nl.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_nl.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js = FOUT: Deze dienst vereist JavaScript.  Zet alstublieft JavaScript aan in uw web browser instellingen.
+error_webrtc = FOUT: Deze dienst vereist WebRTC.  Probeer alstublieft <a href="http://www.mozilla.org";>Mozilla Firefox</a> of <a href="http://www.google.com/chrome";>Google Chrome</a>, het gebruik van de laatste versie is sterk aanbevolen.
+error_no_config = FOUT: JsCommunicator configuratie niet gevonden.
+error_ua_init_failure = FOUT: Mislukt om de useragent te initialiseren.
+error_reg_fail = FOUT: SIP registratie mislukt.
+error_call_attempt_failed = FOUT: Mislukt om een gesprek te starten, controleer of de microfoon en webcam aangesloten zijn, controleer de browser veiligheidsinstellingen, deelnemer ondersteund misschient niet een compatibele codecs.
+error_dynamic = " "
+jsc_login_display_name = Weergave naam (mag leeg zijn)
+jsc_login_sip_uri = SIP-adres
+jsc_login_password = Wachtwoord
+jsc_login_button = Login
+ws_link = WebSocket link:
+ws_state_connected = Verbonden
+ws_state_disconnected = Niet verbonden
+sip_reg = SIP registratie:
+sip_reg_up = Registereerd
+sip_reg_down = Niet registereerd
+sip_dest_address = Bestemming
+session_state_outgoing = Bellen ...
+session_state_incoming = Inkomend gesprek
+session_state_accepted = Bezig met beantwoorden, connectiviteitstest is bezig ...
+session_state_active = Gesprek verbonden
+button_session_cancel = Annuleer
+button_session_reject = Weigeren
+button_session_answer = Aannemen
+button_call_audio = Bel (alleen geluid)
+button_reg = Registreer
+button_dereg = Afmelden
+button_call_audio_video = Bel (beeld en geluid)
+button_session_answer_video = Aannemen (met beeld)
+button_session_answer_hold = Wachtstand
+button_session_answer_hang_up = Ophangen
+button_video_control_self_view = Zelf tonen
+button_video_control_self_hide = Zelf verbergen
+button_video_control_full_screen = Volledig scherm
+welcome = Welkom, 
+call = Bel
+chat = Chat
+enter_contact = Voer contactpersoon in
+type_to_chat = Type om te chatten...
+start_chat = start chat
+me = ik:
+logout = Uitloggen
+no_contact = Voer een contactpersoon in.
+remember_me = Herriner mij
diff -Nru jscommunicator-1.1.1/internationalization/Messages_pl.properties jscommunicator-2.0.1/internationalization/Messages_pl.properties
--- jscommunicator-1.1.1/internationalization/Messages_pl.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_pl.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js = ERROR: Ta usługa wymaga JavaScript. Proszę włączyć JavaScript w ustawieniach przeglądarki WWW.
+error_webrtc = ERROR: Ta usługa wymaga WebRTC.  Spróbuj użyć  <a href="http://www.mozilla.org";>Mozilli Firefox</a> lub <a href="http://www.google.com/chrome";>Google Chrome</a>, rekomendowane są najnowsze wersje.
+error_no_config = ERROR: Konfiguracja JsCommunicator nie znaleziona.
+error_ua_init_failure = ERROR: Nie udało się zainicjalizować klienta.
+error_reg_fail = ERROR: Błąd rejestracji SIP.
+error_call_attempt_failed = ERROR: Nie udało się nawiązać połączenia, sprawdź czy mikrofon/kamera są podłączone, sprawdź ustawienia bezpieczeństwa przeglądarki, druga strona może nie wspierać twoihc kodeków. 
+error_dynamic = " "
+jsc_login_display_name = Wyświetlana nazwa (może być puste)
+jsc_login_sip_uri = Adres SIP
+jsc_login_password = Hasło
+jsc_login_button = Login
+ws_link = Połączenie WebSocket:
+ws_state_connected = Połączono
+ws_state_disconnected = Rozłączono
+sip_reg = Rejestracja SIP:
+sip_reg_up = Zarejestrowano
+sip_reg_down = Nie zarejestrowano
+sip_dest_address = Adres docelowy
+session_state_outgoing = Wybieram ...
+session_state_incoming = Rozmowa przychodząca
+session_state_accepted = Odbieranie, sprawdzanie połączenia ...
+session_state_active = Nazwiązano połączenie
+button_session_cancel = Anuluj
+button_session_reject = Odrzuć
+button_session_answer = Odbierz
+button_call_audio = Zadzwoń (tylko audio)
+button_reg = Rejestracja
+button_dereg = Wyrejestrowanie
+button_call_audio_video = Zadzwoń (audio i video)
+button_session_answer_video = Odbierz (z video)
+button_session_answer_hold = Oczekiwanie
+button_session_answer_hang_up = Rozłacz
+button_video_control_self_view = Pokaż siebie
+button_video_control_self_hide = Schowaj siebie
+button_video_control_full_screen = Pełny ekran
+welcome = Witaj,
+call = Zadzwoń
+chat = Czat
+enter_contact = Wpisz kontakt
+type_to_chat = pisz...
+start_chat = zacznij czat
+me = ja:
+logout = Wyloguj
+no_contact = Prosze wpisać kontakt.
+remember_me = Zapamiętaj mnie
diff -Nru jscommunicator-1.1.1/internationalization/Messages.properties jscommunicator-2.0.1/internationalization/Messages.properties
--- jscommunicator-1.1.1/internationalization/Messages.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js = ERROR: This service requires JavaScript.  Please enable JavaScript in your web browser settings.
+error_webrtc = ERROR: This service requires WebRTC.  Please try <a href="http://www.mozilla.org";>Mozilla Firefox</a> or <a href="http://www.google.com/chrome";>Google Chrome</a>, using the latest version is strongly recommended.
+error_no_config = ERROR: JsCommunicator configuration not found.
+error_ua_init_failure = ERROR: Failed to initialize user agent.
+error_reg_fail = ERROR: SIP Registration failure.
+error_call_attempt_failed = ERROR: Failed to start call, check that microphone/webcam are connected, check browser security settings, peer may not support compatible codecs.
+error_dynamic = " "
+jsc_login_display_name = Display name (may be empty)
+jsc_login_sip_uri = SIP address
+jsc_login_password = Password
+jsc_login_button = Login
+ws_link = WebSocket link:
+ws_state_connected = Connected
+ws_state_disconnected = Disconnected
+sip_reg = SIP registration:
+sip_reg_up = Registered
+sip_reg_down = Not Registered
+sip_dest_address = Destination
+session_state_outgoing = Dialing ...
+session_state_incoming = Incoming call
+session_state_accepted = Answering, connectivity checks in progress ...
+session_state_active = Call connected
+button_session_cancel = Cancel
+button_session_reject = Reject
+button_session_answer = Answer
+button_call_audio = Call (audio only)
+button_reg = Register
+button_dereg = De-Register
+button_call_audio_video = Call (audio and video)
+button_session_answer_video = Answer (with video)
+button_session_answer_hold = Hold
+button_session_answer_hang_up = Hang-up
+button_video_control_self_view = Self view
+button_video_control_self_hide = Self hide
+button_video_control_full_screen = Full screen
+welcome = Welcome, 
+call = Call
+chat = Chat 
+enter_contact = Enter contact
+type_to_chat = type to chat...
+start_chat = start chat
+me = me
+logout = Logout
+no_contact = Please enter a contact.
+remember_me = Remember me
\ No newline at end of file
diff -Nru jscommunicator-1.1.1/internationalization/Messages_pt.properties jscommunicator-2.0.1/internationalization/Messages_pt.properties
--- jscommunicator-1.1.1/internationalization/Messages_pt.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_pt.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js = ERRO: Esse serviço requer JavaScript.  Por favor habilite JavaScript no seu navegador.
+error_webrtc = ERRO: Esse serviço requer WebRTC.  Experimente usar <a href="http://www.mozilla.org";>Mozilla Firefox</a> ou <a href="http://www.google.com/chrome";>Google Chrome</a>, recomendamos utilizar a versão mais recente.
+error_no_config = ERRO: Configuração JsCommunicator não encontrada.
+error_ua_init_failure = ERRO: Falha na inicialização do agente do utilizador.
+error_reg_fail = ERRO: Falha no registro SIP.
+error_call_attempt_failed = ERRO: Falha ao começar a chamada, verifique que o microfone/webcam estão conectados, verifique as definições de segurança do navegador, pode ser que um participante não possui codecs compatíveis.
+error_dynamic = " "
+jsc_login_display_name = Nome exibido (opcional)
+jsc_login_sip_uri = Endereço SIP
+jsc_login_password = Senha
+jsc_login_button = Login
+ws_link = Link WebSocket:
+ws_state_connected = Conectado
+ws_state_disconnected = Disconectado
+sip_reg = Registro SIP:
+sip_reg_up = Registrado
+sip_reg_down = Não Registrado
+sip_dest_address = Destino
+session_state_outgoing = Discando ...
+session_state_incoming = Chamada recebida
+session_state_accepted = Atendendo, verificando a conectividade ...
+session_state_active = Chamada conectada
+button_session_cancel = Cancelar
+button_session_reject = Rejeitar
+button_session_answer = Atender
+button_call_audio = Ligar (apenas audio)
+button_reg = Registrar
+button_dereg = Desregistrar
+button_call_audio_video = Ligar (audio e video)
+button_session_answer_video = Atender (com video)
+button_session_answer_hold = Em espera
+button_session_answer_hang_up = Desligar
+button_video_control_self_view = Visualizar video
+button_video_control_self_hide = Fechar video
+button_video_control_full_screen = Tela cheia
+welcome = Bem-vindo, 
+call = Ligar
+chat = Chat
+enter_contact = Digite um contato
+type_to_chat = digite para enviar uma mensagem...
+start_chat =  Iniciar chat
+me = eu:
+logout = Logout
+no_contact = Por favor digite um contato.
+remember_me = Salvar dados
diff -Nru jscommunicator-1.1.1/internationalization/Messages_sk.properties jscommunicator-2.0.1/internationalization/Messages_sk.properties
--- jscommunicator-1.1.1/internationalization/Messages_sk.properties	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/internationalization/Messages_sk.properties	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+error_js = CHYBA: Táto služba vyžaduje JavaScript. Prosím, zapnite si JavaScript v nastaveniach svojho webového prehliadača.
+error_webrtc = CHYBA: Táto služba vyžaduje WebRTC. Prosím, skúste <a href="http://www.mozilla.org";>Mozilla Firefox</a> alebo <a href="http://www.google.com/chrome";>Google Chrome</a>. Dôrazne odporúčame používať ich najnovšiu verziu.
+error_no_config = CHYBA: Konfiguácia JsCommunicator nebola nájdená.
+error_ua_init_failure = CHYBA: Nepodarilo sa inicializovať klienta.
+error_reg_fail = CHYBA: Chyba registrácie SIP.
+error_call_attempt_failed = CHYBA: Nepodarilo sa spustiť hovor. Skontrolujte, či je váš mikrofón alebo webová kamera zapojená. Skontrolujte nastavenia zabezpečenia v prehliadači. Je tiež možné, že účastník, s ktorým sa snažíte spojiť nepodporuje kompatibilné kodeky.
+error_dynamic = " "
+jsc_login_display_name = Zobrazené meno (môže byť prázdne)
+jsc_login_sip_uri = Adresa SIP
+jsc_login_password = Heslo
+jsc_login_button = Prihlasovacie meno
+ws_link = Odkaz WebSocket:
+ws_state_connected = Spojené
+ws_state_disconnected = Odpojené
+sip_reg = Registrácia SIP:
+sip_reg_up = Zaregistrované
+sip_reg_down = Nezaregistrované
+sip_dest_address = Cieľ
+session_state_outgoing = Prebieha vytáčanie ...
+session_state_incoming = Prichádzajúci hovor
+session_state_accepted = Prijíma sa hovor, prebieha kontrola spojenia ...
+session_state_active = Hovor spojený
+button_session_cancel = Zrušiť
+button_session_reject = Odmietnuť
+button_session_answer = Odpovedať
+button_call_audio = Volať (iba zvuk)
+button_reg = Zaregistrovať
+button_dereg = Odregistrovať
+button_call_audio_video = Volať (zvuk a video)
+button_session_answer_video = Odpovedať (s videom)
+button_session_answer_hold = Podržať
+button_session_answer_hang_up = Zavesiť
+button_video_control_self_view = Zobraziť seba
+button_video_control_self_hide = Skryť seba
+button_video_control_full_screen = Celoobrazovkový režim
+welcome = Vitajte, 
+call = Volať
+chat = Četovať
+enter_contact = Zadajte kontakt
+type_to_chat = tu môžete četovať...
+start_chat = spustiť četovanie
+me = ja
+logout = Odhlásiť sa
+no_contact = prosím, zadajte kontakt.
+remember_me = Zapamätať si ma
diff -Nru jscommunicator-1.1.1/INTERNATIONALIZATION_README.txt jscommunicator-2.0.1/INTERNATIONALIZATION_README.txt
--- jscommunicator-1.1.1/INTERNATIONALIZATION_README.txt	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/INTERNATIONALIZATION_README.txt	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,46 @@
+
+How to add internationalization options
+------------------------------------------------
+
+The jQuery i18n plugin is used to provide internationalization. 
+see https://code.google.com/p/jquery-i18n-properties/ for more info.
+
+To add a language option, create a ‘.properties’ file in the internationalization directory in the following format: Messages_[language code of choice].properties
+Example: Messages_fr.properties for French. 
+
+Copy the content of the default .properties file (Messages.properties) into your new .properties file. The file will have a series of key-value pairs; leave the left side as is and add your translation on the right side.
+Example: 
+(in Messages.properties) jsc_login_display_name = Display name (may be empty)
+(in Messages_fr.properties) jsc_login_display_name = Nom (peut être vide)
+
+Add a language element to the available_languages.xml with the name to be displayed and language code.
+Example:
+<language>
+    <display>French</display>
+    <code>fr</code>
+</language>
+
+Voila!
+
+Behind the scenes
+------------------------------------------------
+
+jQUery i18n will automatically load the .properties file according to the language preference of your browser (if that file exists in the internationalization directory). If a .properties file for you preferred language doesn’t exist, it will default to Messages.properties which is in English.
+
+The available_languages.xml is used to load the language selection drop down menu. If you added a language to the .xml which does not exist in the .properties file, it will default to English. Same goes for any mistakes in the <code> element. jQuery will look for a file Messages_[content of <code>].properties so make sure the name is correct.
+
+
+Dependencies
+------------------------------------------------
+
+jquery.i18n.properties-1.0.9.js (see https://code.google.com/p/jquery-i18n-properties/)
+
+
+Observed bugs
+------------------------------------------------
+
+It is recommended to consult the HTML language code (reference http://www.w3schools.com/tags/ref_language_codes.asp). Theoretically, you can invent your own code, and (provided the code in available_languages.xml corresponds to the name of the .properties file) the select language menu will work. However, the page will not load automatically with the browser language preference (as this uses the HTML language code.
+
+In addition, different browsers may use different variations of code. For example: ‘en’ and ‘en_US’. To work around this, feel free to make multiple versions of your translation (example: Messages_en.properties and Messages_en_US.properties). Of course, you only need to add one to the available_languages.xml.
+
+I think that’s it.
\ No newline at end of file
diff -Nru jscommunicator-1.1.1/JSCommManager.js jscommunicator-2.0.1/JSCommManager.js
--- jscommunicator-1.1.1/JSCommManager.js	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/JSCommManager.js	2014-11-08 20:03:43.000000000 +0100
@@ -3,6 +3,7 @@
  http://jscommunicator.org
 
  Copyright (C) 2013  Daniel Pocock http://danielpocock.com
+ Copyright (C) 2014  Juliana Louback http://julianalouback.com
 
  The JavaScript code in this page is free software: you can
  redistribute it and/or modify it under the terms of the GNU
@@ -40,6 +41,17 @@
 
   init : function() {
 
+    /* We like to use console.log, so make sure it exists */
+    if(!window.console) {
+      window.console = {};
+    }
+    if(!window.console.log) {
+      window.console.log = function() {};
+    }
+    if(!window.console.error) {
+      window.console.error = function() {};
+    }
+
     if(!WebRTCSupported()) {
       JSCommUI.show_error('webrtc');
       Arbiter.publish("jsc/unavailable/webrtc", null, {async:true});
@@ -52,6 +64,11 @@
       return false;
     }
 
+    /* load internationalization options */
+    if(JSCommSettings.i18n.translate) {
+        i18n.initI18n(JSCommSettings.i18n.show_menu);
+    }
+
     this.currentURL = parseUri(window.location.toString());
     if(this.currentURL.queryKey["dial"]) {
       var with_video = JSCommSettings.dialing.auto_dial.use_video;
@@ -66,7 +83,7 @@
         use_video: with_video
       };
     }
-
+ 
     // Copy the credentials from the settings into a local object
     // for use with the login form
     this.credentials = JSCommSettings.user;
@@ -221,6 +238,9 @@
     });
 
     this.phone.on('newMessage', function(e) {
+      // FIXME: if JSCommSettings.chat.enable == false,
+      // we should rejecting incoming messages and send back
+      // a SIP error code.
       JSCommManager.message_received(e);
     });
 
@@ -251,7 +271,9 @@
         this.make_call(default_dest, with_video);
       }
     } else {
-      JSCommUI.set_destination('', false, true);
+      var edit_dest = JSCommSettings.dialing.edit_destination;
+      var show_dest = JSCommSettings.dialing.show_destination;
+      JSCommUI.set_destination('', !edit_dest, show_dest);
     }
   },
 
@@ -314,8 +336,10 @@
 
     var peer_uri = call.remote_identity.uri.toAor().toString();
     var peer_name = '<' + peer_uri + '>';
+	  var peer_display = '';
     if(call.remote_identity.display_name) {
-       peer_name = call.remote_identity.display_name + ' ' + peer_name;
+      peer_name = call.remote_identity.display_name + ' ' + peer_name;
+	    peer_display = call.remote_identity.display_name;
     }
     console.log("peer_name: " + peer_name);
 
@@ -335,7 +359,7 @@
                      (call.getRemoteStreams().length > 0 &&
                       call.getRemoteStreams()[0].getVideoTracks().length > 0);
 
-    JSCommUI.session_start(status, peer_name, with_video);
+    JSCommUI.session_start(status, peer_name, peer_display, peer_uri, with_video);
 
     call.on('progress', function(e) {
       var status;
@@ -381,8 +405,7 @@
   },
 
   message_received : function(e) {
-    // FIXME: implement MESSAGE support
-    console.log("received message, not handled: " + e);
+	JSCommUI.new_message(e);
   },
 
   /*
@@ -444,9 +467,17 @@
       duration : duration
     }
     this.current_session.sendDTMF(dtmf_char, dtmf_opts);
+  },
+ 
+  sendMessage : function(uri, text) {
+  	try {
+  		this.phone.sendMessage(uri,text);
+  	} catch(e){
+  		throw(e);
+  		return;
+  	}
   }
 
 };
 
 })(jQuery);
-
diff -Nru jscommunicator-1.1.1/JSCommUI.js jscommunicator-2.0.1/JSCommUI.js
--- jscommunicator-1.1.1/JSCommUI.js	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/JSCommUI.js	2014-11-08 20:03:43.000000000 +0100
@@ -3,6 +3,7 @@
  http://jscommunicator.org
 
  Copyright (C) 2013  Daniel Pocock http://danielpocock.com
+ Copyright (C) 2014  Juliana Louback http://julianalouback.com
 
  The JavaScript code in this page is free software: you can
  redistribute it and/or modify it under the terms of the GNU
@@ -16,12 +17,42 @@
  that code without the full copy of the GNU GPL normally required
  provided you include this license notice and a URL
  through which recipients can access the Corresponding Source.
-****************************************************************************/
+
+ Portions of this file adapted from JsSIP, http://jssip.net
+
+ Copyright © 2012-2013 José Luis Millán – Versatica <http://www.versatica.com>
+
+ JsSIP code was originally distributed under the following terms:
+
+MIT License 
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+“Software”), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+The original MIT License text can be found at opensource.org.
+
+*****************************************************************************/
 
 (function($) {
 
 window.JSCommUI = {
-
+ 
   soundPlayer : null,
 
   soundLoop : null,
@@ -40,7 +71,9 @@
     console.log("starting init");
 
     // Hide the message "This service requires JavaScript"
-    $("#network-controls #error #js").hide();
+    $("#error #js").hide();
+ 
+ 
 
     if(JSCommSettings.webserver.url_prefix) {
       this.url_prefix = JSCommSettings.webserver.url_prefix;
@@ -107,10 +140,11 @@
     });
 
     $("#session-hangup").click(function() {
+      $("#dtmf-pad").hide();
       JSCommManager.hangup_call();
     });
 
-    $("#dtmf-pad input:button").click(function() {
+    $("#dtmf-pad input:button").mousedown(function() {
       var dtmf_char = $(this).val();
       JSCommUI.send_dtmf(dtmf_char);
     });
@@ -127,60 +161,133 @@
       JSCommUI.video_fullscreen(true);
     });
 
+    $("#dtmf-button").click(function() {
+      $("#dtmf-pad").toggle();
+    });
+ 
+	$("#chat-address").focus(function() {
+		$(this).val("");
+		$("#chat-contact-error").hide();
+	});
+
+  $("#address").focus(function() {
+    $(this).val("");
+    $("#call-contact-error").hide();
+  });
+ 
+	$("#start-chat").click(function () {
+		var destination = $("#chat-address").val();
+		if(destination!="Enter contact" && destination) {
+      session = JSCommUI.getSession(destination, destination);
+      if (!session) {
+        JSCommUI.createChatSession(destination, destination);
+      }
+		} else {
+			$("#chat-contact-error").show();
+		}
+	});
+
+    if(!JSCommSettings.chat || !JSCommSettings.chat.enable) {
+      $("#communicator #chat").hide();
+    }
+ 
     if(!JSCommSettings.registration.user_control) {
-      $("#reg #control").hide();
+      $("#reg #control").text("");
     }
 
     this.init_done = true;
   },
 
   show_login : function() {
-    $("#jsc-login-display-name-field").val(JSCommManager.credentials.display_name);
-    if(JSCommManager.credentials.uri.length > 4) {
-       // strip off the "sip:" URI prefix, it is not shown in the login form
-       $("#jsc-login-sip-address-field").val(JSCommManager.credentials.uri.substr(4));
+    $("#welcome").hide();
+    $("#welcome_name").hide();
+    $("#communicator").hide();
+    $("#jsc-logout-button").hide();
+    if(JSCommManager.credentials.uri) {
+        $("#jsc-login-display-name-field").val(JSCommManager.credentials.display_name);
+        if(JSCommManager.credentials.uri.length > 4) {
+            // strip off the "sip:" URI prefix, it is not shown in the login form
+            $("#jsc-login-sip-address-field").val(JSCommManager.credentials.uri.substr(4));
+        }
+    }
+    else {
+        if(this.get_cookie("displayName")) {
+            $("#jsc-login-display-name-field").val(this.get_cookie("displayName"));
+            $("#jsc-login-sip-address-field").val(this.get_cookie("sipAddress"));
+        }
     }
-    $("#jsc-login-password-field").val(JSCommManager.credentials.sip_auth_password);
+    $("#jsc-login-password-field").val("");
     $("#jsc-login").show();
     $("#jsc-login-button").click(JSCommUI.do_login);
   },
 
   do_login : function() {
     $("#jsc-login").hide();
+    $("#communicator").show();
     JSCommManager.credentials.display_name = $("#jsc-login-display-name-field").val();
     JSCommManager.credentials.uri = 'sip:' + $("#jsc-login-sip-address-field").val();
     JSCommManager.credentials.sip_auth_password = $("#jsc-login-password-field").val();
+    if(JSCommManager.credentials.display_name) {
+      var name = JSCommManager.credentials.display_name
+    } else {
+      name = JSCommUI.get_name(JSCommManager.credentials.uri);
+    }
+    $("#welcome").show();
+    $("#welcome_name").show();
+    $("#welcome_name").text(" " + name);
     JSCommManager.start_ua();
+    $("#jsc-logout-button").show();
+    $("#jsc-logout-button").click(JSCommUI.do_logout);
+    if($("#rememberMe").attr("checked")) {
+        document.cookie = "displayName=".concat($("#jsc-login-display-name-field").val());
+        document.cookie = "sipAddress=".concat($("#jsc-login-sip-address-field").val());
+    }
+  },
+ 
+  do_logout : function() {
+    $("#reg").hide();
+    // Clear any error from earlier failure:
+    $("#error #reg-fail").hide();
+    JSCommUI.show_login();
   },
 
   show_error : function(err_name) {
 
     // Hide the message "This service requires JavaScript"
-    $("#network-controls #error #js").hide();
+    $("#error #js").hide();
 
-    $("#network-controls #error #" + err_name).show();
+    $("#error #" + err_name).show();
   },
 
   show_error_tmp : function(err_name) {
 
     // Hide the message "This service requires JavaScript"
-    $("#network-controls #error #js").hide();
+    $("#error #js").hide();
 
-    $("#network-controls #error #" + err_name).show();
-    $("#network-controls #error #" + err_name).fadeTo(5000, 1, function() {
+    $("#error #" + err_name).show();
+    $("#error #" + err_name).fadeTo(5000, 1, function() {
       $(this).hide();
     });
   },
 
   set_link_state : function(connected) {
-    $("#network-controls #ws").show();
-    $("#network-controls #ws .state").hide();
+    $("#encapsulate #ws").show();
+    $("#encapsulate #ws .state").hide();
     if(connected) {
       $(".ws-disconnected").hide();
-      $("#network-controls #ws #connected").show();
+      $("#encapsulate #ws #connected").show();
+      //re-enables phone 
+      $("#dest :input").attr('disabled', false);
+      $("#dialing-actions :input").attr('disabled', false);
+      $("#new-chat :input").attr('disabled', false);
     } else {
       $(".ws-connected").hide();
-      $("#network-controls #ws #disconnected").show();
+      $("#encapsulate #ws #disconnected").show();
+      //keep phone and chat visible but disabled.
+      $("#dial-controls").show();
+	    $("#dialing-actions :input").attr('disabled', true);
+      $("#dest :input").attr('disabled', true);
+      $("#new-chat :input").attr('disabled', true);
     }
   },
 
@@ -192,6 +299,8 @@
     }
     if(JSCommSettings.dialing.video_dialing) {
       $("#dialing-actions #call-video").show();
+      $("#video-session").draggable();
+      $("#video-session").resizable();
     }
     $("#dest #address").focus();
   },
@@ -200,8 +309,10 @@
     var destination_address = $("#address").val();
     if(destination_address.length < 1) {
       console.log("no destination specified, can't make call");
+      $("#call-contact-error").show();
       return;
     }
+    $("#call-contact-error").hide();
     JSCommManager.make_call(destination_address, with_video);
   },
 
@@ -214,9 +325,9 @@
     // ICE negotiation happens too slowly.
     clearInterval(JSCommUI.soundLoop);
     soundPlayer.pause();
-    $("#session-controls #state span").hide();
-    $("#session-controls #state .session-accepted").show();
-    $("#session-actions input:button").hide();
+    $("#call-info #state span").hide();
+    $("#call-info #state .session-accepted").show();
+    $("#session-actions button").hide();
 
     JSCommManager.answer_call(with_video);
   },
@@ -226,11 +337,15 @@
     $("#address").attr('disabled', locked);
     if(display) {
       $("#dest").show();
+    } else {
+      $("#dest").hide();
     }
   },
 
   incoming_dtmf : function(dtmf_char) {
-    this.play_dtmf_sound(dtmf_char);
+    if(JSCommSettings.session.dialpad_tone) {
+        this.play_dtmf_sound(dtmf_char);
+    }
   },
 
   link_up : function() {
@@ -244,45 +359,50 @@
 
   registration_up : function() {
     // Clear any error from earlier failure:
-    $("#network-controls #error #reg-fail").hide();
+    $("#error #reg-fail").hide();
 
-    $("#network-controls #reg .down").hide();
-    $("#network-controls #reg .up").show();
-    $("#network-controls #reg").show();
+    $("#encapsulate #reg .down").hide();
+    $("#encapsulate #reg .up").show();
+    $("#encapsulate #reg").show();
   },
 
   registration_down : function() {
-    $("#network-controls #reg .up").hide();
-    $("#network-controls #reg .down").show();
-    $("#network-controls #reg").show();
+    $("#encapsulate #reg .up").hide();
+    $("#encapsulate #reg .down").show();
+    $("#encapsulate #reg").show();
   },
 
   registration_failure : function() {
-    $("#network-controls #error #reg-fail").show();
-    $("#network-controls #reg").show();
+    $("#reg .up").hide();
+    $("#error #reg-fail").show();
+    $("#encapsulate #reg").show();
   },
 
   play_again : function() {
     soundPlayer.play();
   },
 
-  session_start : function(status, peer_name, with_video) {
+  session_start : function(status, peer_name, peer_display, peer_uri, with_video) {
     $("#dial-controls").hide();
     $(".session-active").hide();
-    $("#session-controls #state span").hide();
+    $("#call-info #state span").hide();
     $("#session-controls #peer").empty();
     $("#session-controls #peer").text(peer_name);
-    $("#session-actions input:button").hide();
+    $("#session-actions button").hide();
+    session = JSCommUI.getSession(peer_uri, peer_display);
+    if (!session) {
+      JSCommUI.createChatSession(peer_display, peer_uri);
+    }
     if(status == 'incoming') {
-      $("#session-controls #state .session-incoming").show();
-      $("#session-actions input.session-incoming:button").show();
+      $("#call-info #state .session-incoming").show();
+      $("#session-actions .session-incoming").show();
       soundPlayer.setAttribute("src", this.get_sound_url("incoming-call2"));
       soundPlayer.play();
       clearInterval(JSCommUI.soundLoop);
       JSCommUI.soundLoop = setInterval(JSCommUI.play_again, 3000);
     } else if(status == 'trying') {
-      $("#session-controls #state .session-outgoing").show();
-      $("#session-actions input.session-outgoing:button").show();
+      $("#call-info #state .session-outgoing").show();
+      $("#session-actions .session-outgoing").show();
     } else {
       console.log("Unexpected status: " + status);
     }
@@ -300,8 +420,8 @@
     if(!cause) {
       this.show_error_tmp('call-attempt-failed');
     } else {
-      $("#network-controls #error #dynamic").empty();
-      $("#network-controls #error #dynamic").append(cause);
+      $("#error #dynamic").empty();
+      $("#error #dynamic").append(cause);
       this.show_error_tmp('dynamic');
     }
     soundPlayer.setAttribute("src", this.get_sound_url("outgoing-call-rejected"));
@@ -314,6 +434,10 @@
     soundPlayer.pause();
     $("#session-controls").hide();
     $('#video-session').hide();
+    $("#call-info #state span").hide();
+    if(JSCommSettings.dialing.clear_dialbox) {
+        $("#address").val("");
+    }
     JSCommUI.ready_to_dial();
   },
 
@@ -330,15 +454,15 @@
   session_connect : function(call, e) {
     clearInterval(JSCommUI.soundLoop);
     soundPlayer.pause();
-    $("#session-controls #state span").hide();
-    $("#session-controls .session-active").show();
+    $("#call-info #state span").hide();
+    $(".session-active").show();
     if(JSCommSettings.session.show_dtmf_pad) {
       $("#session-controls #dtmf-pad").show();
     } else {
       $("#session-controls #dtmf-pad").hide();
     }
-    $("#session-actions input:button").hide();
-    $("#session-actions input.session-active:button").show();
+    $("#session-actions button").hide();
+    $(".session-active").show();
 
     var local_stream_count = call.getLocalStreams().length;
     var remote_stream_count = call.getRemoteStreams().length;
@@ -376,8 +500,10 @@
     console.log("DTMF press: " + dtmf_char);
     JSCommManager.send_dtmf(dtmf_char);
     // Local sound effects:
-    this.play_dtmf_sound(dtmf_char);
-  },
+    if(JSCommSettings.session.dialpad_tone) {
+        this.play_dtmf_sound(dtmf_char);
+    }
+ },
 
   self_view : function(see_self) {
     $("#video-controls input.self:button").hide();
@@ -415,6 +541,224 @@
     console.log("Playing sound: " + sound_name);
     soundPlayer.setAttribute("src", this.get_sound_url('dialpad/' + sound_name));
     soundPlayer.play();
+  },
+ 
+  load_tabs : function() {
+    $("#label-1").addClass("active-tab");
+    $(".tab-page").hide();
+	$("#chat-error #no-contact").hide();
+    $("#tab-1").show();
+    $(".tab-label").click(function() {
+       JSCommUI.change_tab($(this).attr("id"));
+    });
+  },
+ 
+  change_tab : function(label) {
+    $(".chatSession").hide();
+    $(".active-tab").removeClass("active-tab");
+    var number = label.substring(5);
+    var tab = "#tab";
+    tab = tab.concat(number);
+    $(tab).show();
+    label = '#' + label;
+    $(label).addClass("active-tab");
+    $(label).css("font-weight", "normal");
+  },
+ 
+ //adapted from try.jssip.net
+ createChatSession : function(display_name, uri) {
+   var number = $(".chatSession").length;
+   if(number > 5) {
+      return;
+   }
+   if(!display_name) {
+    display_name = JSCommUI.get_name(uri);
+   }
+   $(".chatSession").hide();
+   $(".tab-label").removeClass("active-tab");
+   var label_div = $('<li class="tab-label active-tab" id="label-'+number+'">'+ display_name +'</li>');
+	 var session_div = $('\
+	 <div class="chatSession" id="tab-'+ number +'"> \
+		<div class="close" value="'+ number +'">x</div> \
+	    <div class="peer"> \
+      <span class="display-name">' + display_name + '</span> \
+			<span>&lt;</span><span class="uri" style="font-weight:bold;">' + uri + '</span><span>&gt;</span> \
+		</div> \
+		<div class="chat"> \
+			<div class="chatting"></div> \
+			<input class="inactive" type="text" name="chat-input" placeholder="type to chat..."/>\
+			<div class="iscomposing"></div> \
+		</div> \
+	 </div> \
+	 ');
+   $("#tab-labels").append(label_div);
+	 $("#tab-pages").append(session_div);
+   i18n.loadBundles($("#lang_selection").val());
+   var label = "#label-".concat(number);
+   var tab = "#tab-".concat(number);
+   var session = $("#tab-pages .chatSession").filter(":last");
+	 var close = $(session).find("> .close");
+	 var chat_input = $(session).find(".chat > input[type='text']");
+
+   $(label).click(function() {
+       JSCommUI.change_tab($(this).attr('id'));
+    });
+	
+	 close.click(function() {
+		$(tab).remove();
+    $(label).remove();
+    var number = $(".chatSession").length;
+    if(number > 0) {
+      var existingLabel = $("#tab-labels .tab-label").filter(":last");
+      JSCommUI.change_tab($(existingLabel).attr("id"));
+    }
+	 });
+	 
+	 chat_input.focus(function(e) {
+		if ($(this).hasClass("inactive")) {
+			$(this).val("");
+			$(this).removeClass("inactive");
+		}
+	 });
+	 
+	 chat_input.blur(function(e) {
+		if ($(this).val() == "") {
+			$(this).addClass("inactive");
+			$(this).val("type to chat...");
+		}
+	 });
+	
+	
+	 chat_input.keydown(function(e) {
+		// Ignore TAB and ESC.
+		if (e.which == 9 || e.which == 27) {
+			return false;
+		}
+		// Enter pressed? so send chat.
+		else if (e.which == 13 && $(this).val() != "") {
+			var text = chat_input.val();
+			JSCommUI.addChatMessage(session, "me", text);
+			chat_input.val("");
+			JSCommUI.jssipMessage(uri, text);
+		}
+		// Ignore Enter when empty input.
+		else if (e.which == 13 && $(this).val() == "") {
+			return false;
+		}
+		// NOTE is-composing stuff.
+		// Ignore "windows" and ALT keys, DEL, mayusculas and 0 (que no sé qué es).
+		else if (e.which == 18 || e.which == 91 || e.which == 46 || e.which == 16 || e.which == 0)
+			return false;
+	 });
+	 
+	 $(session).fadeIn(100);
+	 
+	 // Return the jQuery object for the created session div.
+	 return session;
+ },
+
+ addChatMessage : function(session, who, text) {
+	 var chatting = $(session).find(".chat > .chatting");
+	 $(chatting).removeClass("inactive");
+   name = JSCommUI.get_name(JSCommManager.credentials.uri);
+	 if (who != "error") {
+		var who_text = ( who == "me" ? name : $(session).find(".peer > .display-name").text() );
+		var message_div = $('<p class="' + who + '"><b>' + who_text + '</b>: ' + text + '</p>');
+	 }
+	 // ERROR sending the MESSAGE.
+	 else {
+		var message_div = $('<p class="error"><i>message failed: ' + text + '</i>');
+	 }
+	 $(chatting).append(message_div);
+	 $(chatting).scrollTop(1e4);
+ },
+ 
+ /*
+  * JsSIP.UA new_message event listener
+  */
+ new_message : function(e) {
+	var display_name, text,
+	message = e.data.message,
+	request = e.data.request,
+	uri = request.from.uri;
+	display_name = request.from.display_name || request.from.uri.user;
+	text = request.body;
+	if(e.data.message.direction == 'incoming') {
+		session = JSCommUI.getSession(uri, display_name);
+		if (!session) {
+			session = JSCommUI.createChatSession(display_name, uri);
+		}
+    JSCommUI.message_alert(session);
+		$(session).find(".peer > .display-name").text(display_name);
+		$(session).find(".peer > .uri").text(uri);
+		JSCommUI.addChatMessage(session, "peer", text);
+		$(session).find(".chat input").focus();
+	}
+ },
+
+  //flash chat tab when new message arrives
+  message_alert : function(session) {
+    if(JSCommSettings.session.message_tone) {
+      this.play_message_sound();
+    }
+    var number = $(session).attr('id').substring(4);
+    var label = "#label-";
+    label = label.concat(number);
+    if(!$(label).hasClass('active-tab')) {
+      for(i=0;i<3;i++) {
+        $(label).fadeTo('', 0.5).fadeTo('', 1.0);
+      }
+      $(label).css("font-weight", "bold");
+    }
+  },
+
+  play_message_sound : function() {
+    var sound_name = "new_message";
+    console.log("Playing sound: " + sound_name);
+    soundPlayer.setAttribute("src", this.get_sound_url(sound_name));
+    soundPlayer.play();
+  },
+ 
+ getSession : function(uri, display_name) {
+  if(!display_name) {
+    display_name = JSCommUI.get_name(uri);
+   }
+	var session_found = null;
+	$("#tab-pages > .chatSession").each(function(i, session) {
+		if (uri == $(this).find(".peer > .uri").text()) {
+			session_found = session;
+		} else if (display_name == $(this).find(".peer > .display-name").text()) {
+			session_found = session;
+		}
+	});
+	if (session_found)
+		return session_found;
+	else
+		return false;
+ },
+ 
+ jssipMessage : function(uri, text) {
+	 JSCommManager.sendMessage(uri, text);
+ },
+
+ 
+ /* End of adapted from try.jssip.net */
+
+  get_cookie : function(cookiename) {
+     var name = cookiename + "=";
+     var allcookies = document.cookie.split(';');
+     for(var i=0; i<allcookies.length; i++) {
+     var c = allcookies[i].trim();
+         if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
+     }
+     return "";
+  },
+
+  //Create a name from SIP uri - useful when display name is absent
+  get_name : function(uri) {
+      var full_uri = uri.split(/:|@/);
+      var name = full_uri[1];
+      return name;
   }
 
 };
diff -Nru jscommunicator-1.1.1/jscommunicator.inc jscommunicator-2.0.1/jscommunicator.inc
--- jscommunicator-1.1.1/jscommunicator.inc	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/jscommunicator.inc	2014-11-08 20:03:43.000000000 +0100
@@ -16,7 +16,127 @@
      it is completely valid to include the <script> elements in the
      HTML body where you include the HTML fragement from this file -->
 
-<div id="network-controls">
+<div id="encapsulate">
+    <div id="header">
+        <select id="lang_selection">
+            <option value="en">Select a language</option>
+        </select>
+        <i class="fa fa-power-off" id="jsc-logout-button"></i>
+        <h1>JSCommunicator</h1>
+        <span id="welcome"></span><span id="welcome_name"></span>
+    </div>
+    <div id="network-controls">
+        <div id="jsc-login">
+            <div id="jsc-login-display-name">
+                <span class="jsc-login-label">Display name (may be empty)</span>
+                <input type="text" id="jsc-login-display-name-field"/>
+            </div>
+            <div id="jsc-login-sip-uri">
+                <span class="jsc-login-label">SIP address</span>
+                <input type="text" id="jsc-login-sip-address-field"/>
+            </div>
+            <div id="jsc-login-password">
+                <span class="jsc-login-label">Password</span>
+                <input type="password" id="jsc-login-password-field"/>
+            </div>
+            <div id="jsc-login-option">
+                <input type="checkbox" id="rememberMe"><span id="remember-label">Remember me</span><br>
+            </div>
+            <input type="button" value="Login" id="jsc-login-button"/>
+        </div>
+    </div>
+
+    <div id="communicator">
+        <div id="call">
+            <h3>Call</h3>
+            <div id="call-info">
+                <span class="no-contact" id="call-contact-error">Please enter a contact.</span>
+                <div id="state">
+                    <span class="session-outgoing">Dialing...</span>
+                    <span class="session-incoming">Incoming call</span>
+                    <span class="session-accepted">Answering, connectivity checks in progress...</span>
+                    <span class="session-active">Call connected</span>
+                </div>
+            </div>
+
+            <div id="dial-controls" class="ws-connected">
+                <div id="dest">
+                    <span id="dest_label">Destination:</span>
+                    <input type="text" id="address" placeholder="Enter contact"/>
+                </div>
+                <div id="dialing-actions">
+                    <button id="call-audio"><i class="fa fa-phone fa-lg" style="color:green;"></i></button>
+                    <button id="call-video"><i class="fa fa-video-camera fa-lg" style="color:green;"></i></button>
+                </div>
+            </div>
+
+            <div id="session-controls" class="ws-connected in-call">
+                <div id="peer"></div>
+                <div id="session-actions">
+                    <button value="Cancel" id="session-cancel" class="session-outgoing">
+                        <i class="fa fa-phone fa-lg red-phone" ></i>
+                    </button>
+                    <button value="Reject" id="session-reject" class="session-incoming">
+                        <i class="fa fa-phone fa-lg red-phone" style="color:red;"></i>
+                    </button>
+                    <button value="Answer" id="session-answer" class="session-incoming">
+                        <i class="fa fa-phone fa-lg" style="color:green;"></i>
+                    </button>
+                    <button value="Answer (with video)" id="session-answer-video" class="session-incoming">
+                        <i class="fa fa-video-camera fa-lg" style="color:green;"></i>
+                    </button>
+                    <!-- Not implemented yet?
+                    <button value="Hold" id="session-hold" class="session-active" disabled>
+                        <i class="fa fa-pause fa-lg" style="color:red;"></i>
+                    </button>-->
+                    <button value="Hangup" id="session-hangup" class="session-active">
+                        <i class="fa fa-phone fa-lg red-phone" style="color:red;"></i>
+                    </button>
+                    <button id="dtmf-button" class="session-active">
+                        <i class="fa fa-th fa-lg" style="color:darkblue;"></i>
+                    </button>
+                </div>
+            </div>
+            <div id="dtmf-pad">
+                <input type="button" value="1" class="dtmf-number"/>
+                <input type="button" value="2" class="dtmf-number"/>
+                <input type="button" value="3" class="dtmf-number"/>
+                <input type="button" value="A" class="dtmf-symbol"/>
+                <br/>
+                <input type="button" value="4" class="dtmf-number"/>
+                <input type="button" value="5" class="dtmf-number"/>
+                <input type="button" value="6" class="dtmf-number"/>
+                <input type="button" value="B" class="dtmf-symbol"/>
+                <br/>
+                <input type="button" value="7" class="dtmf-number"/>
+                <input type="button" value="8" class="dtmf-number"/>
+                <input type="button" value="9" class="dtmf-number"/>
+                <input type="button" value="C" class="dtmf-symbol"/>
+                <br/>
+                <input type="button" value="*" class="dtmf-symbol"/>
+                <input type="button" value="0" class="dtmf-number"/>
+                <input type="button" value="#" class="dtmf-symbol"/>
+                <input type="button" value="D" class="dtmf-symbol"/>
+                <br/>
+            </div>
+        </div>
+        <hr>
+        <div id="chat">
+            <h3>Chat</h3>
+            <div id="chat-error">
+                <span class="no-contact" id="chat-contact-error">Please enter a contact.</span>
+            </div>
+            <div id="new-chat">
+                <span id="chat_dest_label">Destination:</span>
+                <input type="text" id="chat-address" placeholder="Enter contact"/>
+                <button id="start-chat"><i class="fa fa-comments fa-lg" style="color:darkblue;"></i></button>
+            </div>
+            <ul id="tab-labels">
+            </ul>
+            <div id="tab-pages">
+            </div>
+        </div>
+    </div>
 
     <div id="error">
         <span id="js">ERROR: This service requires JavaScript.  Please enable JavaScript in your web browser settings.</span>
@@ -27,29 +147,11 @@
         <span id="call-attempt-failed">ERROR: failed to start call, check that microphone/webcam are connected, check browser security settings, peer may not support compatible codecs</span>
         <span id="dynamic"></span>
     </div>
-
-    <div id="jsc-login">
-        <div id="jsc-login-display-name">
-            <span class="jsc-login-label">Display name (may be empty)</span>
-            <input type="text" id="jsc-login-display-name-field"/>
-        </div>
-        <div id="jsc-login-sip-uri">
-            <span class="jsc-login-label">SIP address</span>
-            <span>sip:<input type="text" id="jsc-login-sip-address-field"/></span>
-        </div>
-        <div id="jsc-login-password">
-            <span class="jsc-login-label">Password</span>
-            <input type="password" id="jsc-login-password-field"/>
-        </div>
-        <input type="button" value="Login" id="jsc-login-button"/>
-    </div>
-
     <div id="ws">
-        <span>WebSocket link:</span>
+        <span id="ws_link">WebSocket link:</span>
         <span id="connected" class="state ws-connected">Connected</span>
         <span id="disconnected" class="state ws-disconnected">Disconnected</span>
     </div>
-
     <div id="reg" class="ws-connected up down"><span>SIP registration:</span>
         <span id="state">
             <span class="up">Registered</span>
@@ -60,61 +162,16 @@
             <input type="button" value="De-Register" id="de-reg-button" class="up"/>
         </span>
     </div>
+    
 </div>
-
-<div id="dial-controls" class="ws-connected">
-    <div id="dest">
-        <span>Destination:</span>
-        <input type="text" id="address"/>
-    </div>
-    <div id="dialing-actions">
-        <input type="button" value="Call (audio only)" id="call-audio"/>
-        <input type="button" value="Call (audio and video)" id="call-video"/>
-    </div>
-</div>
-
-<div id="session-controls" class="ws-connected in-call">
-    <div id="state">
-        <span class="session-outgoing">Dialing...</span>
-        <span class="session-incoming">Incoming call</span>
-        <span class="session-accepted">Answering, connectivity checks in progress...</span>
-        <span class="session-active">Call connected</span>
-    </div>
-    <div id="peer"></div>
-    <div id="session-actions">
-        <input type="button" value="Cancel" id="session-cancel" class="session-outgoing"/>
-        <input type="button" value="Reject" id="session-reject" class="session-incoming"/>
-        <input type="button" value="Answer" id="session-answer" class="session-incoming"/>
-        <input type="button" value="Answer (with video)" id="session-answer-video" class="session-incoming"/>
-        <input type="button" value="Hold" id="session-hold" class="session-active" disabled/>
-        <input type="button" value="Hangup" id="session-hangup" class="session-active"/>
-    </div>
-    <div id="dtmf-pad" class="session-active">
-        <input type="button" value="1" class="dtmf-number"/>
-        <input type="button" value="2" class="dtmf-number"/>
-        <input type="button" value="3" class="dtmf-number"/>
-        <br/>
-        <input type="button" value="4" class="dtmf-number"/>
-        <input type="button" value="5" class="dtmf-number"/>
-        <input type="button" value="6" class="dtmf-number"/>
-        <br/>
-        <input type="button" value="7" class="dtmf-number"/>
-        <input type="button" value="8" class="dtmf-number"/>
-        <input type="button" value="9" class="dtmf-number"/>
-        <br/>
-        <input type="button" value="*" class="dtmf-symbol"/>
-        <input type="button" value="0" class="dtmf-number"/>
-        <input type="button" value="#" class="dtmf-symbol"/>
-    </div>
-</div>
-
+    
 <div id="video-session" class="ws-connected in-call">
-    <video id="remoteView" autoplay></video>
+    <video id="remoteView" autoplay controls></video>
     <video id="selfView" autoplay muted></video>
     <div id="video-controls">
         <input type="button" value="Self view" id="video-control-self-view" class="self"/>
         <input type="button" value="Self hide" id="video-control-self-hide" class="self"/>
-        <input type="button" value="Full screen" id="video-control-fullscreen" disabled/>
     </div>
 </div>
 
+
diff -Nru jscommunicator-1.1.1/make-release jscommunicator-2.0.1/make-release
--- jscommunicator-1.1.1/make-release	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/make-release	2014-11-08 20:03:43.000000000 +0100
@@ -2,7 +2,7 @@
 
 set -e
 
-RELEASE_FILES="JSCommManager.js JSCommUI.js jssip-helper.js parseuri.js webrtc-check.js"
+RELEASE_FILES="i18n.js JSCommManager.js JSCommUI.js jssip-helper.js parseuri.js webrtc-check.js"
 RELEASE_JS="JSComm.js"
 
 MINIFY_GCC=closure-compiler
diff -Nru jscommunicator-1.1.1/phone-dev.shtml jscommunicator-2.0.1/phone-dev.shtml
--- jscommunicator-1.1.1/phone-dev.shtml	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/phone-dev.shtml	2014-11-08 20:03:43.000000000 +0100
@@ -1,26 +1,34 @@
 <!DOCTYPE html>
 <head>
+<meta charset="utf-8"/>
 <title>Testing</title>
 <link rel="stylesheet" href="style.css" type="text/css"/>
 <link rel="stylesheet" href="style-horizontal.css" type="text/css"/>
+<link rel="stylesheet" href="skin.css" type="text/css"/>
 <script src="jquery.js" type="text/javascript"></script>
 <script src="Arbiter.js" type="text/javascript"></script>
+<script src="jquery.i18n.properties.js" type="text/javascript"></script>
+<!-- For resizeable webcam display -->
+<script src="jquery-ui.js"></script>
+<link rel="stylesheet" href="jquery-ui.css" type="text/css"/>
 <!--<script src="http://jssip.net/download/jssip-devel.js";></script>-->
 <script src="JsSIP.js" type="text/javascript"></script>
 <script src="init.js" type="text/javascript"></script>
 <script src="config.js" type="text/javascript"></script>
 
 <!-- Each uncompressed source file loaded separately -->
+<script src="i18n.js" type="text/javascript"></script>
 <script src="JSCommManager.js" type="text/javascript"></script>
 <script src="JSCommUI.js" type="text/javascript"></script>
 <script src="webrtc-check.js" type="text/javascript"></script>
 <script src="jssip-helper.js" type="text/javascript"></script>
 <script src="parseuri.js" type="text/javascript"></script>
+
+<!--font-->
+<link rel="stylesheet" href="font-awesome/css/font-awesome.min.css">
 </head>
 <body>
 
-<h1>JSCommunicator</h1>
-
 <!-- To make this work, you must
        a) have mod_include enabled in Apache (on Debian: a2enmod include)
        b) have a Directory element in your server configuration
diff -Nru jscommunicator-1.1.1/phone.shtml jscommunicator-2.0.1/phone.shtml
--- jscommunicator-1.1.1/phone.shtml	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/phone.shtml	2014-11-08 20:03:43.000000000 +0100
@@ -1,10 +1,16 @@
 <!DOCTYPE html>
 <head>
+<meta charset="utf-8"/>
 <title>Testing</title>
 <link rel="stylesheet" href="style.css" type="text/css"/>
 <link rel="stylesheet" href="style-horizontal.css" type="text/css"/>
+<link rel="stylesheet" href="skin.css" type="text/css"/>
 <script src="jquery.js" type="text/javascript"></script>
 <script src="Arbiter.js" type="text/javascript"></script>
+<script src="jquery.i18n.properties.js" type="text/javascript"></script>
+<!-- For resizeable webcam display -->
+<script src="jquery-ui.js"></script>
+<link rel="stylesheet" href="jquery-ui.css" type="text/css"/>
 <!--<script src="http://jssip.net/download/jssip-devel.js";></script>-->
 <script src="JsSIP.js" type="text/javascript"></script>
 <script src="init.js" type="text/javascript"></script>
@@ -12,11 +18,11 @@
 
 <!-- compressed JavaScript source built by make-release script -->
 <script src="JSComm.js" type="text/javascript"></script>
+<!--font-->
+<link rel="stylesheet" href="font-awesome/css/font-awesome.min.css">
 </head>
 <body>
 
-<h1>JSCommunicator</h1>
-
 <!-- To make this work, you must
        a) have mod_include enabled in Apache (on Debian: a2enmod include)
        b) have a Directory element in your server configuration
diff -Nru jscommunicator-1.1.1/README.txt jscommunicator-2.0.1/README.txt
--- jscommunicator-1.1.1/README.txt	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/README.txt	2014-11-08 20:03:43.000000000 +0100
@@ -25,10 +25,26 @@
 You need to have the following JavaScript libraries available in your
 web server or CMS:
 
+  JsSIP (we currently rely on the code from the develop branch)
+
   jQuery (v1.4 or greater has been tested)
 
+  jQuery UI
+
+  jQuery.i18n.properties
+
   ArbiterJS (v1.0 has been tested)
 
+  Font Awesome (v4.1 or greater has been tested, earlier versions
+    do not work)
+
+All requirements can be easily fetched using either of the following
+methods:
+
+ * on a Debian/Ubuntu system, use the "deb-setup.sh" script
+
+ * on other systems, see the "code_grabber" script
+
 Use cases
 ---------
 
diff -Nru jscommunicator-1.1.1/skin.css jscommunicator-2.0.1/skin.css
--- jscommunicator-1.1.1/skin.css	1970-01-01 01:00:00.000000000 +0100
+++ jscommunicator-2.0.1/skin.css	2014-11-08 20:03:43.000000000 +0100
@@ -0,0 +1,45 @@
+span {
+  color:#FFF;
+ }
+
+ #peer {
+  color:#FFF;
+}
+
+#lang_selection {
+  background-color: #888;
+  color:#FFF;
+}
+
+#communicator {
+  border-radius: 6px;
+  border-style: solid;
+  border-color: #FFF;
+  border-width: 1px;
+}
+
+#dtmf-pad {
+  border: 1px solid #FFF;
+  opacity: 0.8;
+}
+
+#encapsulate {
+  background-color: #888;
+  border-radius: 6px;
+}
+
+#error span, #ws span, #reg span {
+  color: white;
+}
+
+#header h1 {
+  color: white;
+}
+
+#jsc-logout-button {
+  color: #FFF;
+}
+
+h3 {
+  color: white;
+}
\ No newline at end of file
Binary files /tmp/EDsIZRT0Sk/jscommunicator-1.1.1/sounds/new_message.ogg and /tmp/b3lR4UN50p/jscommunicator-2.0.1/sounds/new_message.ogg differ
Binary files /tmp/EDsIZRT0Sk/jscommunicator-1.1.1/sounds/new_message.wav and /tmp/b3lR4UN50p/jscommunicator-2.0.1/sounds/new_message.wav differ
diff -Nru jscommunicator-1.1.1/style.css jscommunicator-2.0.1/style.css
--- jscommunicator-1.1.1/style.css	2014-02-06 22:48:30.000000000 +0100
+++ jscommunicator-2.0.1/style.css	2014-11-08 20:03:43.000000000 +0100
@@ -1,66 +1,40 @@
-/****************************************************************************
- JSCommunicator
- http://jscommunicator.org
-
- Copyright (C) 2013  Daniel Pocock http://danielpocock.com
-
- The JavaScript code in this page is free software: you can
- redistribute it and/or modify it under the terms of the GNU
- General Public License (GNU GPL) as published by the Free Software
- Foundation, either version 2 of the License, or (at your option)
- any later version.  The code is distributed WITHOUT ANY WARRANTY;
- without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
-
- You may distribute non-source (e.g., minimized or compacted) forms of
- that code without the full copy of the GNU GPL normally required
- provided you include this license notice and a URL
- through which recipients can access the Corresponding Source.
-****************************************************************************/
-
-#network-controls #error span {
+#error span {
   display: none;
 }
 
-#network-controls #error #js {
+#error #js {
   display: inline;
 }
 
 #network-controls #jsc-login {
   display: none;
+  clear:both;
 }
 
 #network-controls #jsc-login .jsc-login-label {
   float: left;
-  width: 200px;
+  width: 230px;
+  height:23px;
 }
 
-#network-controls #ws {
+#encapsulate #ws {
   display: none;
 }
 
-#network-controls #ws .state {
+#encapsulate #reg {
   display: none;
 }
 
-#network-controls #reg {
-  display: none;
-}
-
-#network-controls #reg #de-reg-button {
+#encapsulate #reg #de-reg-button {
   display: none;
 }
 
 #dest {
-  display: none;
+  float:left;
 }
 
-#dial-controls {
-  display: none;
-}
-
-#dial-controls #call-video {
-  display: none;
+#dialing-actions {
+  float:right;
 }
 
 #session-controls {
@@ -94,5 +68,283 @@
   background-color: #111;
   border-top: 2px solid #CCC;
   border-right: 2px solid #CCC;
+  padding: 5px;
+}
+
+#network-controls input{
+float:right;
+}
+
+#jsc-login-button,#ws{
+clear:both;
+}
+
+#chat {
+  padding: 5px;
+  clear:both;
+  min-height: 70px;
+}
+
+.tab-label{
+  margin:6px 3px 0 0;
+  padding:5px;
+  display:block;
+  float:left;
+  background-color:#C1C1C1;
+  border-top-left-radius:4px;
+  border-top-right-radius:4px;
+  font: -webkit-small-control;
+  width: 42px;
+  overflow: hidden;
+}
+
+#chat > ul {
+  padding: 0px;
+  margin: 0px;
+}
+
+.active-tab {
+  background-color:#F0F0F0;
+}   
+
+/* adapted from try.jssip.net */
+
+.chatSession {
+  display: block;
+  float: left;
+  background-color:#F0F0F0;
+  border-radius: 0 10px 10px 0;
+  padding: 5px;
+  margin-bottom: 5px;
+  width: 338px;
+}
+
+.chatSession .close {
+  float: right;
+  color: darkred;
+  font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
+  cursor: pointer;
+  margin-right: 4px;
+  font-size: 12px;
+}
+
+.chatSession .peer span {
+  font-size: 12px;
+  font-weight: bold;
+  color: #555;
 }
 
+.chatSession .chat {
+  position: relative;
+  margin-top: 10px;
+}
+
+.chatSession .chat .chatting {
+  position: relative;
+  background: #FFF;
+  padding: 5px;
+  font-size: 12px;
+  color: #333;
+  height: 50px;
+  overflow: auto;
+  border: 1px solid #CCC;
+}
+
+.chatSession .chat .iscomposing {
+  position: absolute;
+  /* background: url("../images/iscomposing2.gif") no-repeat;*/
+  width: 26px;
+  height: 26px;
+  bottom: 32px;
+  right: 16px;
+  z-index: 20;
+  display: none;
+}
+
+.chatSession .chat .chatting p {
+  font-size: inherit;
+  margin: 0px;
+  font-family: sans-serif;
+}
+
+.chatSession .chat .chatting p.me {
+  color: #444;
+}
+
+.chatSession .chat .chatting p.peer {
+  color: #008F00;
+}
+
+.chatSession .chat .chatting p.error {
+  color: red;
+}
+
+.chatSession .chat input[type="text"] {
+  position: relative;
+  margin: 5px 0 0 0;
+  display: block;
+  line-height: 24px;
+  height: 24px;
+  border: 1px solid #CCC;
+  border-radius: 0 0 5px 0;
+  font-size: 12px;
+  text-indent: 5px;
+  color: #000;
+  font-style: normal;
+  width: 334px
+}
+
+.chatSession .chat input[type="text"].inactive {
+  color: #888;
+  font-style: italic;
+}
+
+/* end of adapted from try.jssip.net */
+
+#new-chat {
+  display: block;
+  margin-top: 3px;
+}
+
+.no-contact {
+  color: darkred;
+  font-style: italic;
+  font-family: sans-serif;
+  font-size: 12px;
+  display: block;
+}
+
+
+
+#dtmf-pad input{
+  float:left;
+  width: 25px;
+  margin: 2px;
+}
+
+#dtmf-pad br{
+  clear:both;
+}
+
+#jsc-login-option input{
+  float:left;
+}
+
+#jsc-login-option {
+  clear:both;
+}
+
+#encapsulate {
+  width: 360px;
+  padding: 3px;
+}
+
+#call {
+  height: 64px;
+  padding: 5px;
+  clear:both;
+}
+
+#error span, #ws span, #reg span {
+  font: -webkit-small-control;
+  letter-spacing: normal;
+}
+
+#header {
+  height: 100px;
+}
+
+#header h1 {
+  font-family: Arial;
+  font-weight: normal;
+  margin:0;
+  display: block;
+}
+
+#jsc-logout-button {
+  float:right;
+  margin: 3px;
+}
+
+#welcome {
+  display: inline;
+}
+
+h3 {
+  font-family: Arial;
+  font-weight: normal;
+  margin:0;
+  margin-top: 5px;
+}
+
+hr {
+  margin:6px;
+  margin-bottom: 0px;
+}
+
+span {
+  font-family: Arial;
+  font-size: 14px;
+  margin-left: 3px;
+}
+
+#peer {
+  font-family: Arial;
+  font-size: 14px;
+  margin-left: 3px;
+  display: inline;
+  float: left;
+}
+
+.red-phone {
+  -webkit-transform:rotate(135deg);
+  -moz-transform:rotate(135deg);
+  -o-transform:rotate(135deg);
+  color:red;
+}
+
+#lang_selection {
+  float:left;
+  display: inline;
+  margin-bottom: 8px;
+}
+
+#jsc-login-option {
+  float:right;
+}
+
+#communicator {
+  clear: both;
+  overflow: hidden;
+}
+
+#dtmf-pad {
+  z-index: 200;
+  position: absolute;
+  top: 72px;
+  left: 244px;
+  display: none;
+}
+
+#session-actions {
+  float: right;
+}
+
+#start-chat {
+  float:right;
+}
+
+#chat-error, #call-info {
+  height: 12px;
+  margin-bottom: 4px;
+}
+
+#chat-error span, #call-info span{
+  display: none;
+}
+
+#call-video {
+  display: none;
+}
+
+

--- End Message ---
--- Begin Message ---
On 2014-11-21 19:33, Daniel Pocock wrote:
> 
> 
> On 21/11/14 17:35, Niels Thykier wrote:
>> Control: tags -1 moreinfo
>>
>> On 2014-11-10 18:37, Daniel Pocock wrote:
>>> [...]
>>>
>>> Furthermore, JSCommunicator 2.x has not changed from an API user
>>> perspective.  [...]
>>>
>>
>> [...]
>>
>> Is this upload of JSCommunicator breaking the API?
> 
> 
> No, it does not break the API, it simply adds some extra API features
> (new options in config.js).  The main API is async messaging through
> ArbiterJS and that hasn't changed at all.
> 
> [...]

Ok, good.  I had not spotted any API breakages, but your wording ("from
an user perspective") made me concerned.

With that, I have unblocked jscommunicator.

~Niels

--- End Message ---

Reply to: