Repository: openmeetings
Updated Branches:
  refs/heads/4.0.x f25da38fb -> ae1b51a99


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/ae1b51a9/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
index d875a31..6b9c3fe 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
@@ -56,7 +56,6 @@ import 
org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.MainPanel;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.head.CssHeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
@@ -65,9 +64,7 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.HiddenField;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.request.resource.CssResourceReference;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
-import org.apache.wicket.request.resource.ResourceReference;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
@@ -78,8 +75,6 @@ import 
com.googlecode.wicket.jquery.ui.plugins.wysiwyg.WysiwygEditor;
 public class Chat extends Panel {
        private static final long serialVersionUID = 1L;
        private static final Logger log = 
Red5LoggerFactory.getLogger(Chat.class, getWebAppRootKey());
-       public static final ResourceReference EMOTIONS_JS_REFERENCE = new 
JavaScriptResourceReference(Chat.class, "cssemoticons.js");
-       public static final ResourceReference EMOTIONS_CSS_REFERENCE = new 
CssResourceReference(Chat.class, "cssemoticons.css");
        private static final String PARAM_MSG_ID = "msgid";
        private static final String PARAM_ROOM_ID = "roomid";
        private static final String PARAM_TYPE = "type";
@@ -156,9 +151,7 @@ public class Chat extends Panel {
        @Override
        public void renderHead(IHeaderResponse response) {
                super.renderHead(response);
-               response.render(new 
PriorityHeaderItem(JavaScriptHeaderItem.forReference(EMOTIONS_JS_REFERENCE)));
                response.render(new 
PriorityHeaderItem(JavaScriptHeaderItem.forReference(new 
JavaScriptResourceReference(Chat.class, "chat.js"))));
-               
response.render(CssHeaderItem.forReference(EMOTIONS_CSS_REFERENCE));
                response.render(new 
PriorityHeaderItem(getNamedFunction("chatActivity", chatActivity, 
explicit(PARAM_TYPE), explicit(PARAM_ROOM_ID), explicit(PARAM_MSG_ID))));
 
                if (showDashboardChat) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/ae1b51a9/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
new file mode 100644
index 0000000..67665f4
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
@@ -0,0 +1,373 @@
+/* Licensed under the Apache License, Version 2.0 (the "License") 
http://www.apache.org/licenses/LICENSE-2.0 */
+var Chat = function() {
+       const align = Settings.isRtl ? 'align-right' : 'align-left'
+               , alignIco = Settings.isRtl ? 'align-left' : 'align-right'
+               , tabTemplate = "<li><a href='#{href}'>#{label}</a></li>"
+               , msgTemplate = "<div class='clear msg-row' 
id='chat-msg-id-#{id}'><img class='profile " + align + "' 
src='#{imgSrc}'/><span class='from " + align + "' 
data-user-id='#{userId}'>#{from}</span><span class='" + align + 
"'>#{msg}</span><span class='date " + alignIco + "'>#{sent}</span></div>"
+               , acceptTemplate = "<div class='tick om-icon " + alignIco + " 
clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='const 
e=$(this);chatActivity('accept',e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
+               , infoTemplate = "<div class='user om-icon " + alignIco + " 
clickable' data-user-id='#{userId}' onclick='const 
e=$(this);showUserInfo(e.data(\"userId\"));'></div>"
+               , addTemplate = "<div class='add om-icon " + alignIco + " 
clickable' data-user-id='#{userId}' onclick='const 
e=$(this);addContact(e.data(\"userId\"));'></div>"
+               , messageTemplate = "<div class='new-email om-icon " + alignIco 
+ " clickable' data-user-id='#{userId}' onclick='const 
e=$(this);privateMessage(e.data(\"userId\"));'></div>"
+               , inviteTemplate = "<div class='invite om-icon " + alignIco + " 
clickable' data-user-id='#{userId}' onclick='const 
e=$(this);inviteUser(e.data(\"userId\"));'></div>"
+               , closeBlock = "<span class='ui-icon ui-icon-close' 
role='presentation'></span>"
+               , closedSize = 20
+               , closedSizePx = closedSize + "px"
+               , emoticon = new CSSEmoticon()
+               , doneTypingInterval = 5000 //time in ms, 5 second for example
+               , iconOpen = 'ui-icon-caret-1-n'
+               , iconOpenRoom = 'ui-icon-caret-1-' + (Settings.isRtl ? 'e' : 
'w')
+               , iconClose = 'ui-icon-caret-1-s'
+               , iconCloseRoom = 'ui-icon-caret-1-' + (Settings.isRtl ? 'w' : 
'e')
+               ;
+       let p, pp, ctrl, icon, tabs, openedHeight = "345px", openedWidth = 
"300px", allPrefix = "All"
+               , roomPrefix = "Room ", typingTimer, audio, roomMode = false, 
globalWidth = 600
+               , editor = $('#chatMessage .wysiwyg-editor')
+               ;
+
+       try {
+               audio = new Audio('./public/chat_message.mp3');
+       } catch (e) {
+               //not implemented in IE
+               audio = {
+                       play: function() {}
+               };
+       }
+       function _load() {
+               const s = Settings.load();
+               if (typeof(s.chat) === 'undefined') {
+                       s.chat = {};
+               }
+               return s;
+       }
+       function _updateBtn(s, a) {
+               const muted = s.chat.muted === true;
+               a.removeClass('sound' + (muted ? '' : 
'-mute')).addClass('sound' + (muted ? '-mute' : ''))
+                               .attr('title', a.data(muted ? 'sound-enabled' : 
'sound-muted'));
+       }
+       function doneTyping () {
+               typingTimer = null;
+               chatActivity('typing_stop', $('.room.box').data('room-id'));
+       }
+       function initToolbar() {
+               const emtBtn = $('#emoticons');
+               emtBtn.html('');
+               emtBtn.append(' ' + emoticon.emoticonize(':)') + ' <b 
class="caret"></b>');
+               const emots = [].concat.apply([], [emoticon.threeCharEmoticons, 
emoticon.twoCharEmoticons]);
+               for (let ei in emoticon.specialEmoticons) {
+                       emots.push(ei);
+               }
+               const rowSize = 20, emotMenuList = $('#emotMenuList');
+               emotMenuList.html('');
+               let row = $('<tr></tr>');
+               for (let i = 0; i < emots.length; ++i) {
+                       row.append('<td><div class="emt" 
onclick="Chat.emtClick(\'' + emots[i] + '\');">'
+                               + emoticon.emoticonize(emots[i]) + 
'</div></td>');
+                       if (i !== 0 && i % rowSize === 0) {
+                               emotMenuList.append(row);
+                               row = $('<tr></tr>');
+                       }
+               }
+               const a = $('#chat .audio');
+               _updateBtn(_load(), a);
+               $('#chat .chat-btn').hover(function(){ 
$(this).addClass('ui-state-hover') }, function(){ 
$(this).removeClass('ui-state-hover') });
+               a.off().click(function() {
+                       const s = _load();
+                       s.chat.muted = !s.chat.muted;
+                       _updateBtn(s, a);
+                       Settings.save(s);
+               });
+       }
+       function isClosed() {
+               return p.hasClass('closed');
+       }
+       function activateTab(id) {
+               tabs.tabs("option", "active", tabs.find('a[href="#' + id + 
'"]').parent().index());
+       }
+       function isInited() {
+               return !!$("#chatTabs").data("ui-tabs");
+       }
+       function _reinit(_allPrefix, _roomPrefix) {
+               allPrefix = _allPrefix;
+               roomPrefix = _roomPrefix;
+               p = $('#chatPanel');
+               pp = $('#chatPanel, #chatPopup');
+               ctrl = $('#chatPopup .control.block');
+               icon = $('#chatPopup .control.block .ui-icon');
+               editor = $('#chatMessage .wysiwyg-editor');
+               icon.removeClass(function(index, className) {
+                       return (className.match (/(^|\s)ui-icon-caret-\S+/g) || 
[]).join(' ');
+               });
+               initToolbar();
+               tabs = $("#chatTabs").tabs({
+                       activate: function(event, ui) {
+                               $('#activeChatTab').val(ui.newPanel[0].id);
+                       }
+               });
+               // close icon: removing the tab on click
+               tabs.delegate("span.ui-icon-close", "click", function() {
+                       const panelId = 
$(this).closest("li").remove().attr("aria-controls");
+                       $("#" + panelId).remove();
+                       tabs.tabs("refresh");
+               });
+               if (roomMode) {
+                       icon.addClass(isClosed() ? iconOpenRoom : 
iconCloseRoom);
+                       p.addClass('room').hover(_open, _close);
+                       pp.width(closedSize);
+                       _removeResize();
+               } else {
+                       ctrl.attr('title', '');
+                       icon.addClass(isClosed() ? iconOpen : iconClose);
+                       
ctrl.height(closedSize).width(globalWidth).off('click').click(Chat.toggle);
+                       pp.width(globalWidth).height(closedSize);
+                       p.removeClass('room opened').addClass('closed')
+                               .off('mouseenter mouseleave')
+                               .resizable({
+                                       handles: 'n, ' + (Settings.isRtl ? 'w' 
: 'e')
+                                       , disabled: isClosed()
+                                       , alsoResize: "#chatPopup, #chat 
.ui-tabs .ui-tabs-panel.messageArea"
+                                       , minHeight: 195
+                                       , minWidth: 260
+                                       , stop: function(event, ui) {
+                                               p.css({'top': '', 'left': ''});
+                                               openedHeight = ui.size.height + 
"px";
+                                               globalWidth = ui.size.width;
+                                       }
+                               });
+               }
+               $('#chatMessage').off().on('input propertychange paste', 
function () {
+                       const room = $('.room.box');
+                       if (room.length) {
+                               if (!!typingTimer) {
+                                       clearTimeout(typingTimer);
+                               } else {
+                                       chatActivity('typing_start', 
room.data('room-id'));
+                               }
+                               typingTimer = setTimeout(doneTyping, 
doneTypingInterval);
+                       }
+               });
+       }
+       function _removeTab(id) {
+               $('#chat li[aria-controls="' + id + '"]').remove();
+               $('#' + id).remove();
+               if (isInited()) {
+                       tabs.tabs("refresh");
+               }
+       }
+       function _addTab(id, label) {
+               if (!isInited()) {
+                       _reinit();
+               }
+               if ($('#chat').length < 1 || $('#' + id).length) {
+                       return;
+               }
+               if (!label) {
+                       label = id === "chatTab-all" ? allPrefix : roomPrefix + 
id.substr(9);
+               }
+               const li = $(tabTemplate.replace(/#\{href\}/g, "#" + 
id).replace(/#\{label\}/g, label));
+               if (id.indexOf("chatTab-r") !== 0) {
+                       li.append(closeBlock);
+               }
+               tabs.find(".ui-tabs-nav").append(li);
+               tabs.append("<div class='messageArea' id='" + id + "'></div>");
+               tabs.tabs("refresh");
+               activateTab(id);
+       }
+       function _addMessage(m) {
+               if ($('#chat').length > 0 && m && m.type === "chat") {
+                       if (isClosed()) {
+                               ctrl.addClass('ui-state-highlight');
+                               const s = _load();
+                               if (p.is(':visible') && s.chat.muted !== true) {
+                                       const playPromise = audio.play();
+
+                                       // In browsers that don’t yet support 
this functionality,
+                                       // playPromise won’t be defined.
+                                       if (playPromise !== undefined) {
+                                               playPromise.then(function() {
+                                                       // Automatic playback 
started!
+                                               }).catch(function() {
+                                                       // Automatic playback 
failed.
+                                               });
+                                       }
+                               }
+                       }
+                       let msg, cm;
+                       while (!!(cm = m.msg.pop())) {
+                               let area = $('#' + cm.scope);
+                               msg = $(msgTemplate.replace(/#\{id\}/g, cm.id)
+                                               .replace(/#\{userId\}/g, 
cm.from.id)
+                                               .replace(/#\{imgSrc\}/g, 
!!cm.from.img ? cm.from.img : './profile/' + cm.from.id + '?anticache=' + 
Date.now())
+                                               .replace(/#\{from\}/g, 
cm.from.name)
+                                               .replace(/#\{sent\}/g, cm.sent)
+                                               .replace(/#\{msg\}/g, 
emoticon.emoticonize(!!cm.message ? cm.message : "")));
+                               const date = msg.children('.date');
+                               date.after(infoTemplate.replace(/#\{userId\}/g, 
cm.from.id));
+                               if ("full" === cm.actions) {
+                                       
date.after(addTemplate.replace(/#\{userId\}/g, cm.from.id));
+                                       
date.after(messageTemplate.replace(/#\{userId\}/g, cm.from.id));
+                                       
date.after(inviteTemplate.replace(/#\{userId\}/g, cm.from.id));
+                               }
+                               if (cm.needModeration) {
+                                       
msg.append(acceptTemplate.replace(/#\{msgid\}/g, cm.id).replace(/#\{roomid\}/g, 
cm.scope.substring(9)));
+                               }
+                               if (!area.length) {
+                                       _addTab(cm.scope, cm.scopeName);
+                                       area = $('#' + cm.scope);
+                               }
+                               if (m.mode === "accept") {
+                                       $('#chat-msg-id-' + cm.id).remove();
+                               }
+                               const btm = area.scrollTop() + 
area.innerHeight() >= area[0].scrollHeight;
+                               area.append(msg);
+                               if (btm) {
+                                       area.animate({
+                                               scrollTop: area[0].scrollHeight
+                                       }, 300);
+                               }
+                       }
+               }
+       }
+       function _setOpened() {
+               p.addClass('opened').off('mouseenter mouseleave');
+               p.resizable({
+                       handles: (Settings.isRtl ? 'e' : 'w')
+                       , alsoResize: '#chatPopup'
+                       , stop: function(event, ui) {
+                               p.css({'left': ''});
+                               openedWidth = ui.size.width + 'px';
+                       }
+               });
+               Room.setSize();
+       }
+       function _removeResize() {
+               if (p.resizable('instance') !== undefined) {
+                       p.resizable('destroy');
+               }
+       }
+       function _open(handler) {
+               if (isClosed()) {
+                       icon.removeClass(roomMode ? iconOpenRoom : 
iconOpen).addClass(roomMode ? iconCloseRoom : iconClose);
+                       ctrl.removeClass('ui-state-highlight');
+                       let opts;
+                       if (roomMode) {
+                               opts = {width: openedWidth};
+                               ctrl.height(closedSize);
+                       } else {
+                               opts = {height: openedHeight};
+                               p.resizable("option", "disabled", false);
+                       }
+                       p.removeClass('closed');
+                       pp.animate(opts, 1000, function() {
+                               p.removeClass('closed');
+                               $('#chat .ui-tabs 
.ui-tabs-panel.messageArea').height(p.height() - closedSize - $('#chat 
.ui-tabs-nav').height() - $('#chat form').height() - 5);
+                               $('#chat .messageArea').each(function() {
+                                       
$(this).scrollTop($(this)[0].scrollHeight);
+                               });
+                               if (typeof(handler) === 'function') {
+                                       handler();
+                               }
+                               if (roomMode) {
+                                       ctrl.off('click').click(function() {
+                                               if (p.hasClass('opened')) {
+                                                       ctrl.attr('title', 
ctrl.data('ttl-dock'));
+                                                       _close(Room.setSize);
+                                                       
p.removeClass('opened').hover(_open, _close);
+                                                       _removeResize();
+                                               } else {
+                                                       ctrl.attr('title', 
ctrl.data('ttl-undock'));
+                                                       _setOpened();
+                                               }
+                                       }).attr('title', ctrl.data('ttl-dock'));
+                               }
+                       });
+               }
+       }
+       function _close(handler) {
+               if (!isClosed()) {
+                       icon.removeClass(roomMode ? iconCloseRoom : 
iconClose).addClass(roomMode ? iconOpenRoom : iconOpen);
+                       let opts;
+                       if (roomMode) {
+                               opts = {width: closedSizePx};
+                               ctrl.off('click');
+                       } else {
+                               opts = {height: closedSizePx};
+                               p.resizable("option", "disabled", true);
+                       }
+                       pp.animate(opts, 1000, function() {
+                               p.addClass('closed');
+                               if (roomMode) {
+                                       ctrl.height(p.height());
+                               }
+                               if (typeof(handler) === 'function') {
+                                       handler();
+                               }
+                       });
+               }
+       }
+       function _toggle() {
+               if (isClosed()) {
+                       _open();
+               } else {
+                       _close();
+               }
+       }
+       function _emtClick(emoticon) {
+               editor.html(editor.html() + ' ' + emoticon + ' 
').trigger('change');
+       }
+       function _clean() {
+               editor.html('').trigger('change');
+       }
+       function _setRoomMode(_mode) {
+               roomMode = _mode;
+               _reinit(allPrefix, roomPrefix);
+       }
+       function _setHeight(h) {
+               pp.height(h);
+               if (isClosed()) {
+                       ctrl.height(h);
+               }
+       }
+
+       return {
+               reinit: _reinit
+               , removeTab: _removeTab
+               , addTab: _addTab
+               , addMessage: _addMessage
+               , open: _open
+               , setOpened: function() {
+                       _open(function() {
+                               _setOpened();
+                       });
+               }
+               , close: _close
+               , toggle: _toggle
+               , emtClick: _emtClick
+               , setRoomMode: _setRoomMode
+               , setHeight: _setHeight
+               , clean: _clean
+       };
+}();
+$(function() {
+       Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
+               try {
+                       if (msg instanceof Blob) {
+                               return; //ping
+                       }
+                       const m = jQuery.parseJSON(msg);
+                       if (m) {
+                               switch(m.type) {
+                                       case "chat":
+                                               Chat.addMessage(m);
+                                               break;
+                                       case "typing":
+                                               if (typeof(typingActivity) === 
"function") {
+                                                       typingActivity(m.uid, 
m.active);
+                                               }
+                                               break;
+                               }
+                       }
+               } catch (err) {
+                       //no-op
+               }
+       });
+});

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/ae1b51a9/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
deleted file mode 100644
index cc66752..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
+++ /dev/null
@@ -1,374 +0,0 @@
-/* Licensed under the Apache License, Version 2.0 (the "License") 
http://www.apache.org/licenses/LICENSE-2.0 */
-var Chat = function() {
-       const align = Settings.isRtl ? 'align-right' : 'align-left'
-               , alignIco = Settings.isRtl ? 'align-left' : 'align-right'
-               , tabTemplate = "<li><a href='#{href}'>#{label}</a></li>"
-               , msgTemplate = "<div class='clear msg-row' 
id='chat-msg-id-#{id}'><img class='profile " + align + "' 
src='#{imgSrc}'/><span class='from " + align + "' 
data-user-id='#{userId}'>#{from}</span><span class='" + align + 
"'>#{msg}</span><span class='date " + alignIco + "'>#{sent}</span></div>"
-               , acceptTemplate = "<div class='tick om-icon " + alignIco + " 
clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='const 
e=$(this);chatActivity('accept',e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
-               , infoTemplate = "<div class='user om-icon " + alignIco + " 
clickable' data-user-id='#{userId}' onclick='const 
e=$(this);showUserInfo(e.data(\"userId\"));'></div>"
-               , addTemplate = "<div class='add om-icon " + alignIco + " 
clickable' data-user-id='#{userId}' onclick='const 
e=$(this);addContact(e.data(\"userId\"));'></div>"
-               , messageTemplate = "<div class='new-email om-icon " + alignIco 
+ " clickable' data-user-id='#{userId}' onclick='const 
e=$(this);privateMessage(e.data(\"userId\"));'></div>"
-               , inviteTemplate = "<div class='invite om-icon " + alignIco + " 
clickable' data-user-id='#{userId}' onclick='const 
e=$(this);inviteUser(e.data(\"userId\"));'></div>"
-               , closeBlock = "<span class='ui-icon ui-icon-close' 
role='presentation'></span>"
-               , closedSize = 20
-               , closedSizePx = closedSize + "px"
-               , emoticon = new CSSEmoticon()
-               , doneTypingInterval = 5000 //time in ms, 5 second for example
-               , iconOpen = 'ui-icon-caret-1-n'
-               , iconOpenRoom = 'ui-icon-caret-1-' + (Settings.isRtl ? 'e' : 
'w')
-               , iconClose = 'ui-icon-caret-1-s'
-               , iconCloseRoom = 'ui-icon-caret-1-' + (Settings.isRtl ? 'w' : 
'e')
-               ;
-       let p, pp, ctrl, icon, tabs, openedHeight = "345px", openedWidth = 
"300px", allPrefix = "All"
-               , roomPrefix = "Room ", typingTimer, audio, roomMode = false, 
globalWidth = 600
-               , editor = $('#chatMessage .wysiwyg-editor')
-               ;
-
-       try {
-               audio = new Audio('./public/chat_message.mp3');
-       } catch (e) {
-               //not implemented in IE
-               audio = {
-                       play: function() {}
-               };
-       }
-       function _load() {
-               const s = Settings.load();
-               if (typeof(s.chat) === 'undefined') {
-                       s.chat = {};
-               }
-               return s;
-       }
-       function _updateBtn(s, a) {
-               const muted = s.chat.muted === true;
-               a.removeClass('sound' + (muted ? '' : 
'-mute')).addClass('sound' + (muted ? '-mute' : ''))
-                               .attr('title', a.data(muted ? 'sound-enabled' : 
'sound-muted'));
-       }
-       function doneTyping () {
-               typingTimer = null;
-               chatActivity('typing_stop', $('.room.box').data('room-id'));
-       }
-       function initToolbar() {
-               const emtBtn = $('#emoticons');
-               emtBtn.html('');
-               emtBtn.append(' ' + emoticon.emoticonize(':)') + ' <b 
class="caret"></b>');
-               const emots = [].concat.apply([], [emoticon.threeCharEmoticons, 
emoticon.twoCharEmoticons]);
-               for (let ei in emoticon.specialEmoticons) {
-                       emots.push(ei);
-               }
-               const rowSize = 20, emotMenuList = $('#emotMenuList');
-               emotMenuList.html('');
-               let row = $('<tr></tr>');
-               for (let i = 0; i < emots.length; ++i) {
-                       row.append('<td><div class="emt" 
onclick="Chat.emtClick(\'' + emots[i] + '\');">'
-                               + emoticon.emoticonize(emots[i]) + 
'</div></td>');
-                       if (i !== 0 && i % rowSize === 0) {
-                               emotMenuList.append(row);
-                               row = $('<tr></tr>');
-                       }
-               }
-               const a = $('#chat .audio');
-               _updateBtn(_load(), a);
-               $('#chat .chat-btn').hover(function(){ 
$(this).addClass('ui-state-hover') }, function(){ 
$(this).removeClass('ui-state-hover') });
-               a.off().click(function() {
-                       const s = _load();
-                       s.chat.muted = !s.chat.muted;
-                       _updateBtn(s, a);
-                       Settings.save(s);
-               });
-       }
-       function isClosed() {
-               return p.hasClass('closed');
-       }
-       function activateTab(id) {
-               tabs.tabs("option", "active", tabs.find('a[href="#' + id + 
'"]').parent().index());
-       }
-       function isInited() {
-               return !!$("#chatTabs").data("ui-tabs");
-       }
-       function _reinit(_allPrefix, _roomPrefix) {
-               allPrefix = _allPrefix;
-               roomPrefix = _roomPrefix;
-               p = $('#chatPanel');
-               pp = $('#chatPanel, #chatPopup');
-               ctrl = $('#chatPopup .control.block');
-               icon = $('#chatPopup .control.block .ui-icon');
-               editor = $('#chatMessage .wysiwyg-editor');
-               icon.removeClass(function(index, className) {
-                       return (className.match (/(^|\s)ui-icon-caret-\S+/g) || 
[]).join(' ');
-               });
-               initToolbar();
-               tabs = $("#chatTabs").tabs({
-                       activate: function(event, ui) {
-                               $('#activeChatTab').val(ui.newPanel[0].id);
-                       }
-               });
-               // close icon: removing the tab on click
-               tabs.delegate("span.ui-icon-close", "click", function() {
-                       const panelId = 
$(this).closest("li").remove().attr("aria-controls");
-                       $("#" + panelId).remove();
-                       tabs.tabs("refresh");
-               });
-               if (roomMode) {
-                       icon.addClass(isClosed() ? iconOpenRoom : 
iconCloseRoom);
-                       p.addClass('room').hover(_open, _close);
-                       pp.width(closedSize);
-                       _removeResize();
-               } else {
-                       ctrl.attr('title', '');
-                       icon.addClass(isClosed() ? iconOpen : iconClose);
-                       
ctrl.height(closedSize).width(globalWidth).off('click').click(Chat.toggle);
-                       pp.width(globalWidth).height(closedSize);
-                       p.removeClass('room opened').addClass('closed')
-                               .off('mouseenter mouseleave')
-                               .resizable({
-                                       handles: 'n, ' + (Settings.isRtl ? 'w' 
: 'e')
-                                       , disabled: isClosed()
-                                       , alsoResize: "#chatPopup, #chat 
.ui-tabs .ui-tabs-panel.messageArea"
-                                       , minHeight: 195
-                                       , minWidth: 260
-                                       , stop: function(event, ui) {
-                                               p.css({'top': '', 'left': ''});
-                                               openedHeight = ui.size.height + 
"px";
-                                               globalWidth = ui.size.width;
-                                       }
-                               });
-               }
-               $('#chatMessage').off().on('input propertychange paste', 
function () {
-                       const room = $('.room.box');
-                       if (room.length) {
-                               if (!!typingTimer) {
-                                       clearTimeout(typingTimer);
-                               } else {
-                                       chatActivity('typing_start', 
room.data('room-id'));
-                               }
-                               typingTimer = setTimeout(doneTyping, 
doneTypingInterval);
-                       }
-               });
-       }
-       function _removeTab(id) {
-               $('#chat li[aria-controls="' + id + '"]').remove();
-               $('#' + id).remove();
-               if (isInited()) {
-                       tabs.tabs("refresh");
-               }
-       }
-       function _addTab(id, label) {
-               if (!isInited()) {
-                       _reinit();
-               }
-               if ($('#chat').length < 1 || $('#' + id).length) {
-                       return;
-               }
-               if (!label) {
-                       label = id === "chatTab-all" ? allPrefix : roomPrefix + 
id.substr(9);
-               }
-               const li = $(tabTemplate.replace(/#\{href\}/g, "#" + 
id).replace(/#\{label\}/g, label));
-               if (id.indexOf("chatTab-r") !== 0) {
-                       li.append(closeBlock);
-               }
-               tabs.find(".ui-tabs-nav").append(li);
-               tabs.append("<div class='messageArea' id='" + id + "'></div>");
-               tabs.tabs("refresh");
-               activateTab(id);
-       }
-       function _addMessage(m) {
-               if ($('#chat').length > 0 && m && m.type === "chat") {
-                       if (isClosed()) {
-                               ctrl.addClass('ui-state-highlight');
-                               const s = _load();
-                               if (p.is(':visible') && s.chat.muted !== true) {
-                                       const playPromise = audio.play();
-
-                                       // In browsers that don’t yet support 
this functionality,
-                                       // playPromise won’t be defined.
-                                       if (playPromise !== undefined) {
-                                               playPromise.then(function() {
-                                                       // Automatic playback 
started!
-                                               }).catch(function() {
-                                                       // Automatic playback 
failed.
-                                               });
-                                       }
-                               }
-                       }
-                       let msg, cm;
-                       while (!!(cm = m.msg.pop())) {
-                               let area = $('#' + cm.scope);
-                               msg = $(msgTemplate.replace(/#\{id\}/g, cm.id)
-                                               .replace(/#\{userId\}/g, 
cm.from.id)
-                                               .replace(/#\{imgSrc\}/g, 
!!cm.from.img ? cm.from.img : './profile/' + cm.from.id + '?anticache=' + 
Date.now())
-                                               .replace(/#\{from\}/g, 
cm.from.name)
-                                               .replace(/#\{sent\}/g, cm.sent)
-                                               .replace(/#\{msg\}/g, 
emoticon.emoticonize(!!cm.message ? cm.message : "")));
-                               const date = msg.children('.date');
-                               date.after(infoTemplate.replace(/#\{userId\}/g, 
cm.from.id));
-                               if ("full" === cm.actions) {
-                                       
date.after(addTemplate.replace(/#\{userId\}/g, cm.from.id));
-                                       
date.after(messageTemplate.replace(/#\{userId\}/g, cm.from.id));
-                                       
date.after(inviteTemplate.replace(/#\{userId\}/g, cm.from.id));
-                               }
-                               if (cm.needModeration) {
-                                       
msg.append(acceptTemplate.replace(/#\{msgid\}/g, cm.id).replace(/#\{roomid\}/g, 
cm.scope.substring(9)));
-                               }
-                               if (!area.length) {
-                                       _addTab(cm.scope, cm.scopeName);
-                                       area = $('#' + cm.scope);
-                               }
-                               if (m.mode === "accept") {
-                                       $('#chat-msg-id-' + cm.id).remove();
-                               }
-                               const btm = area.scrollTop() + 
area.innerHeight() >= area[0].scrollHeight;
-                               area.append(msg);
-                               if (btm) {
-                                       area.animate({
-                                               scrollTop: area[0].scrollHeight
-                                       }, 300);
-                               }
-                       }
-               }
-       }
-       function _setOpened() {
-               p.addClass('opened').off('mouseenter mouseleave');
-               p.resizable({
-                       handles: (Settings.isRtl ? 'e' : 'w')
-                       , alsoResize: '#chatPopup'
-                       , stop: function(event, ui) {
-                               p.css({'left': ''});
-                               openedWidth = ui.size.width + 'px';
-                       }
-               });
-               Room.setSize();
-       }
-       function _removeResize() {
-               if (p.resizable('instance') !== undefined) {
-                       p.resizable('destroy');
-               }
-       }
-       function _open(handler) {
-               if (isClosed()) {
-                       icon.removeClass(roomMode ? iconOpenRoom : 
iconOpen).addClass(roomMode ? iconCloseRoom : iconClose);
-                       ctrl.removeClass('ui-state-highlight');
-                       let opts;
-                       if (roomMode) {
-                               opts = {width: openedWidth};
-                               ctrl.height(closedSize);
-                       } else {
-                               opts = {height: openedHeight};
-                               p.resizable("option", "disabled", false);
-                       }
-                       p.removeClass('closed');
-                       pp.animate(opts, 1000, function() {
-                               p.removeClass('closed');
-                               $('#chat .ui-tabs 
.ui-tabs-panel.messageArea').height(p.height() - closedSize - $('#chat 
.ui-tabs-nav').height() - $('#chat form').height() - 5);
-                               $('#chat .messageArea').each(function() {
-                                       
$(this).scrollTop($(this)[0].scrollHeight);
-                               });
-                               if (typeof(handler) === 'function') {
-                                       handler();
-                               }
-                               if (roomMode) {
-                                       ctrl.off('click').click(function() {
-                                               if (p.hasClass('opened')) {
-                                                       ctrl.attr('title', 
ctrl.data('ttl-dock'));
-                                                       _close(Room.setSize);
-                                                       
p.removeClass('opened').hover(_open, _close);
-                                                       _removeResize();
-                                               } else {
-                                                       ctrl.attr('title', 
ctrl.data('ttl-undock'));
-                                                       _setOpened();
-                                               }
-                                       }).attr('title', ctrl.data('ttl-dock'));
-                               }
-                       });
-               }
-       }
-       function _close(handler) {
-               if (!isClosed()) {
-                       icon.removeClass(roomMode ? iconCloseRoom : 
iconClose).addClass(roomMode ? iconOpenRoom : iconOpen);
-                       let opts;
-                       if (roomMode) {
-                               opts = {width: closedSizePx};
-                               ctrl.off('click');
-                       } else {
-                               opts = {height: closedSizePx};
-                               p.resizable("option", "disabled", true);
-                       }
-                       pp.animate(opts, 1000, function() {
-                               p.addClass('closed');
-                               if (roomMode) {
-                                       ctrl.height(p.height());
-                               }
-                               if (typeof(handler) === 'function') {
-                                       handler();
-                               }
-                       });
-               }
-       }
-       function _toggle() {
-               if (isClosed()) {
-                       _open();
-               } else {
-                       _close();
-               }
-       }
-       function _emtClick(emoticon) {
-               editor.html(editor.html() + ' ' + emoticon + ' 
').trigger('change');
-       }
-       function _clean() {
-               editor.html('').trigger('change');
-       }
-       function _setRoomMode(_mode) {
-               roomMode = _mode;
-               _reinit(allPrefix, roomPrefix);
-       }
-       function _setHeight(h) {
-               pp.height(h);
-               if (isClosed()) {
-                       ctrl.height(h);
-               }
-       }
-
-       return {
-               reinit: _reinit
-               , removeTab: _removeTab
-               , addTab: _addTab
-               , addMessage: _addMessage
-               , open: _open
-               , setOpened: function() {
-                       _open(function() {
-                               _setOpened();
-                       });
-               }
-               , close: _close
-               , toggle: _toggle
-               , emtClick: _emtClick
-               , setRoomMode: _setRoomMode
-               , setHeight: _setHeight
-               , clean: _clean
-       };
-}();
-
-$(function() {
-       Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
-               try {
-                       if (msg instanceof Blob) {
-                               return; //ping
-                       }
-                       const m = jQuery.parseJSON(msg);
-                       if (m) {
-                               switch(m.type) {
-                                       case "chat":
-                                               Chat.addMessage(m);
-                                               break;
-                                       case "typing":
-                                               if (typeof(typingActivity) === 
"function") {
-                                                       typingActivity(m.uid, 
m.active);
-                                               }
-                                               break;
-                               }
-                       }
-               } catch (err) {
-                       //no-op
-               }
-       });
-});

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/ae1b51a9/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.css
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.css
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.css
deleted file mode 100644
index c14765c..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.css
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * jQuery CSSEmoticons plugin 0.2.9
- *
- * Copyright (c) 2010 Steve Schwartz (JangoSteve)
- *
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- *
- * Date: Sun Oct 22 1:00:00 2010 -0500
- */
- 
- /* Basic styles for emoticons */
-span.css-emoticon {
-  font-family: "Trebuchet MS"; /* seems to give the best and most consistent 
emoticon appearance */
-  font-size: 0.65em;
-  font-weight: bold;
-  color: #000000;
-  display: inline-block;
-  overflow: hidden;
-  vertical-align: middle;
-  transform: rotate(90deg);
-  -webkit-transform: rotate(90deg);
-  -moz-transform: rotate(90deg);
-  -o-transform: rotate(90deg);
-  width: 1.54em; /* note that this is a multiple of this span's font-size, not 
containing text font-size */
-  height: 1.54em; /* so, relative to containing text, width and height are 0.9 
x 1.6 = 1.44em */
-  text-align: center;
-  padding: 0;
-  line-height: 1.34em;
-  -moz-border-radius: 1.54em;
-  -webkit-border-radius: 1.54em;
-  border-radius: 1.54em;
-  -moz-box-shadow: 1px -1px 2px rgba(0,0,0,0.5);
-  -webkit-box-shadow: 1px -1px 2px rgba(0,0,0,0.5);
-  box-shadow: 1px -1px 2px rgba(0,0,0,0.5);
-  border: 1px solid rgba(0,0,0,0.25);
-  background-color: #ffcc00;
-  background-image: -webkit-gradient(
-    linear,
-    right top,
-    left top,
-    color-stop(0.41, rgb(255,204,0)),
-    color-stop(0.56, rgb(255,221,85)),
-    color-stop(1, rgb(255,238,170))
-  );
-  background-image: -moz-linear-gradient(
-    center right,
-    rgb(255,204,0) 41%,
-    rgb(255,221,85) 56%,
-    rgb(255,238,170) 100%
-  );
-  -webkit-transition-property:color, background, transform;  
-  -webkit-transition-duration: 1s, 1s;  
-  -webkit-transition-timing-function: linear, ease-in;
-}
-
-/* Styles for two-character emoticons that need more letter-spacing for 
proportionality */
-span.css-emoticon.spaced-emoticon {
-  padding-left: 0.2em;
-  width: 1.34em;
-  letter-spacing: 0.2em;
-}
-
-/* This is a dirty dirty hack, because webkit doesn't properly do the 
padding+width=total-width as it should
-   I think the width of the border may be throwing things off, because it's 
more noticable for small icons */
-@media screen and (-webkit-min-device-pixel-ratio:0) {
-  span.css-emoticon.spaced-emoticon {
-    width: 1.4em;
-  }
-}
-
-/* Styles for emoticons that need to have smaller characters to fit inside the 
circle */
-span.css-emoticon.small-emoticon {
-  font-size: 0.55em;
-  width: 1.82em;
-  height: 1.82em;
-  line-height: 1.72em;
-  -moz-border-radius: 1.82em;
-  -webkit-border-radius: 1.82em;
-  border-radius: 1.82em;
-}
-
-span.css-emoticon.small-emoticon.spaced-emoticon {
-  padding-left: 0;
-  width: 1.82em;
-  letter-spacing: 0.1em;
-}
-
-/* Styles for additional colors */
-span.css-emoticon.red-emoticon {
-  background-color: #eb0542;
-  background-image: -webkit-gradient(
-    linear,
-    right top,
-    left top,
-    color-stop(0.41, rgb(235,5,66)),
-    color-stop(0.56, rgb(235,38,90)),
-    color-stop(1, rgb(250,55,110))
-  );
-  background-image: -moz-linear-gradient(
-    center right,
-    rgb(235,5,66) 41%,
-    rgb(235,38,90) 56%,
-    rgb(250,55,110) 100%
-  );
-}
-
-span.css-emoticon.pink-emoticon {
-  background-color: #ff8fd4;
-  background-image: -webkit-gradient(
-    linear,
-    right top,
-    left top,
-    color-stop(0.41, rgb(255,143,212)),
-    color-stop(0.56, rgb(255,153,216)),
-    color-stop(1,    rgb(255,173,225))
-  );
-  background-image: -moz-linear-gradient(
-    center right,
-    rgb(255,143,212) 41%,
-    rgb(255,153,216) 56%,
-    rgb(255,173,225) 100%
-  );
-}
-
-/* styles for emoticons that need no rotation, like O_o */
-span.css-emoticon.no-rotate { 
-  transform: rotate(0deg);
-  -webkit-transform: rotate(0deg);
-  -moz-transform: rotate(0deg);
-  -o-transform: rotate(0deg);
-  -moz-box-shadow: 1px 1px 2px rgba(0,0,0,0.5);
-  -webkit-box-shadow: 1px 1px 2px rgba(0,0,0,0.5);
-  box-shadow: 1px 1px 2px rgba(0,0,0,0.5);
-  font-size: 0.45em;
-  width: 2.2em;
-  height: 2.2em;
-  line-height: 1.9em;
-  -moz-border-radius: 2.2em;
-  -webkit-border-radius: 2.2em;
-  border-radius: 2.2em;
-  background-image: -webkit-gradient(
-    linear,
-    right bottom,
-    right top,
-    color-stop(0.41, rgb(255,204,0)),
-    color-stop(0.56, rgb(255,221,85)),
-    color-stop(1, rgb(255,238,170))
-  );
-  background-image: -moz-linear-gradient(
-    center bottom,
-    rgb(255,204,0) 41%,
-    rgb(255,221,85) 56%,
-    rgb(255,238,170) 100%
-  );
-}
-
-span.css-emoticon.no-rotate.red-emoticon {
-  background-image: -webkit-gradient(
-    linear,
-    right bottom,
-    right top,
-    color-stop(0.41, rgb(235,5,66)),
-    color-stop(0.56, rgb(235,38,90)),
-    color-stop(1, rgb(250,55,110))
-  );
-  background-image: -moz-linear-gradient(
-    center bottom,
-    rgb(235,5,66) 41%,
-    rgb(235,38,90) 56%,
-    rgb(250,55,110) 100%
-  );
-}
-
-span.css-emoticon.no-rotate.pink-emoticon {
-  background-image: -webkit-gradient(
-    linear,
-    right bottom,
-    right top,
-    color-stop(0.41, rgb(255,143,212)),
-    color-stop(0.56, rgb(255,153,216)),
-    color-stop(1,    rgb(255,173,225))
-  );
-  background-image: -moz-linear-gradient(
-    center bottom,
-    rgb(255,143,212) 41%,
-    rgb(255,153,216) 56%,
-    rgb(255,173,225) 100%
-  );
-}
-
-/* Styles for emoticons that need to be rotated counter-clockwise, like <3 */
-span.css-emoticon.counter-rotated { 
-  transform: rotate(-90deg);
-  -webkit-transform: rotate(-90deg);
-  -moz-transform: rotate(-90deg);
-  -o-transform: rotate(-90deg);
-  -moz-box-shadow: -1px 1px 2px rgba(0,0,0,0.5);
-  -webkit-box-shadow: -1px 1px 2px rgba(0,0,0,0.5);
-  box-shadow: -1px 1px 2px rgba(0,0,0,0.5);
-  background-image: -webkit-gradient(
-    linear,
-    left top,
-    right top,
-    color-stop(0.41, rgb(255,204,0)),
-    color-stop(0.56, rgb(255,221,85)),
-    color-stop(1, rgb(255,238,170))
-  );
-  background-image: -moz-linear-gradient(
-    center left,
-    rgb(255,204,0) 41%,
-    rgb(255,221,85) 56%,
-    rgb(255,238,170) 100%
-  );
-}
-
-span.css-emoticon.counter-rotated.red-emoticon {
-  background-image: -webkit-gradient(
-    linear,
-    left top,
-    right top,
-    color-stop(0.41, rgb(235,5,66)),
-    color-stop(0.56, rgb(235,38,90)),
-    color-stop(1, rgb(250,55,110))
-  );
-  background-image: -moz-linear-gradient(
-    center left,
-    rgb(235,5,66) 41%,
-    rgb(235,38,90) 56%,
-    rgb(250,55,110) 100%
-  );
-}
-
-span.css-emoticon.counter-rotated.pink-emoticon {
-  background-image: -webkit-gradient(
-    linear,
-    left top,
-    right top,
-    color-stop(0.41, rgb(255,143,212)),
-    color-stop(0.56, rgb(255,153,216)),
-    color-stop(1,    rgb(255,173,225))
-  );
-  background-image: -moz-linear-gradient(
-    center left,
-    rgb(255,143,212) 41%,
-    rgb(255,153,216) 56%,
-    rgb(255,173,225) 100%
-  );
-}
-
-/* Styles for animated states */
-span.css-emoticon.un-transformed-emoticon, 
span.css-emoticon.animated-emoticon:hover {
-    /* font-size: inherit;
-    font-weight: inherit;
-    vertical-align: inherit;
-    line-height: inherit;
-    font-family: inherit; */
-    letter-spacing: inherit;
-    color: inherit;
-    overflow: visible;
-    transform: rotate(0deg);
-    -webkit-transform: rotate(0deg);
-    -moz-transform: rotate(0deg);
-    -o-transform: rotate(0deg);
-    background: none;
-    background-image: none;
-    box-shadow: none;
-    -moz-box-shadow: none;
-    -webkit-box-shadow: none;
-    border-color: transparent;
-}
-
-span.css-emoticon.nintendo-controller {
-  font-size: .8em;
-  height: 1.2em;
-  line-height: 1em;
-  width: 2.7em;
-  vertical-align: bottom;
-  border-radius: 0;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  background: -webkit-gradient(
-      linear,
-      left bottom,
-      left top,
-      color-stop(0.09, rgb(116,121,140)),
-      color-stop(0.55, rgb(165,170,189))
-  );
-  background: -moz-linear-gradient(
-      center bottom,
-      rgb(116,121,140) 9%,
-      rgb(165,170,189) 55%
-  );
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/ae1b51a9/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.min.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.min.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.min.js
deleted file mode 100644
index 006989f..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/cssemoticons.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Dual licensed under the MIT and GPL licenses */
-var 
CSSEmoticon=function(){this.escapeCharacters=[")","(","*","[","]","{","}","|","^","<",">","\\","?","+","=","."];this.threeCharacterEmoticons=[":-)",":o)",":c)",":^)",":-D",":-(",":-9",";-)",":-P",":-p",":-Þ",":-b",":-O",":-/",":-X",":-#",":'(","B-)","8-)",";*(",":-*",":-\\","?-)"];this.threeCharEmoticons=this.threeCharacterEmoticons.slice();this.twoCharacterEmoticons=[":)",":]","=]","=)","8)",":}",":D",":(",":[",":{","=(",";)",";]",";D",":P",":p","=P","=p",":b",":Þ",":O",":/","=/",":S",":#",":X","B)",":|",":\\","=\\",":*",":&gt;",":&lt;"];this.twoCharEmoticons=this.twoCharacterEmoticons.slice();this.specialEmoticons={"&gt;:)":{cssClass:"red-emoticon
 small-emoticon spaced-emoticon"},"&gt;;)":{cssClass:"red-emoticon 
small-emoticon spaced-emoticon"},"&gt;:(":{cssClass:"red-emoticon 
small-emoticon spaced-emoticon"},"&gt;: )":{cssClass:"red-emoticon 
small-emoticon"},"&gt;; )":{cssClass:"red-emoticon small-emoticon"},"&gt;: 
(":{cssClass:"red-emoticon small-emoticon"},";(":{cssClass:
 "red-emoticon spaced-emoticon"},"&lt;3":{cssClass:"pink-emoticon 
counter-rotated"},"O_O":{cssClass:"no-rotate"},"o_o":{cssClass:"no-rotate"},"0_o":{cssClass:"no-rotate"},"O_o":{cssClass:"no-rotate"},"T_T":{cssClass:"no-rotate"},"^_^":{cssClass:"no-rotate"},"O:)":{cssClass:"small-emoticon
 spaced-emoticon"},"O: 
)":{cssClass:"small-emoticon"},"8D":{cssClass:"small-emoticon 
spaced-emoticon"},"XD":{cssClass:"small-emoticon 
spaced-emoticon"},"xD":{cssClass:"small-emoticon 
spaced-emoticon"},"=D":{cssClass:"small-emoticon 
spaced-emoticon"},"8O":{cssClass:"small-emoticon 
spaced-emoticon"},"[+=..]":{cssClass:"no-rotate nintendo-controller"}};var 
a=new RegExp('(\\'+this.escapeCharacters.join('|\\')+')','g');var 
b='(^|[\\s\\0])';for(var 
c=this.threeCharacterEmoticons.length-1;c>=0;--c){this.threeCharacterEmoticons[c]=this.threeCharacterEmoticons[c].replace(a,'\\$1');this.threeCharacterEmoticons[c]=new
 RegExp(b+'('+this.threeCharacterEmoticons[c]+')','g');}for(var 
c=this.twoCharacterEmoticons.le
 
ngth-1;c>=0;--c){this.twoCharacterEmoticons[c]=this.twoCharacterEmoticons[c].replace(a,'\\$1');this.twoCharacterEmoticons[c]=new
 RegExp(b+'('+this.twoCharacterEmoticons[c]+')','g');}for(var d in 
this.specialEmoticons){this.specialEmoticons[d].regexp=d.replace(a,'\\$1');this.specialEmoticons[d].regexp=new
 
RegExp(b+'('+this.specialEmoticons[d].regexp+')','g');}this.defaults={animate:true,delay:500,exclude:'pre,code,.no-emoticons'};};CSSEmoticon.prototype.emoticonize=function(a,b){var
 c={};for(var d in this.defaults)c[d]=this.defaults[d];for(var d in 
b)c[d]=b[d];var e='span.css-emoticon';if(c.exclude)e+=','+c.exclude;var 
f=e.split(',');var g='css-emoticon';if(c.animate)g+=' un-transformed-emoticon 
animated-emoticon';for(var h in this.specialEmoticons){var i=g+" 
"+this.specialEmoticons[h].cssClass;a=a.replace(this.specialEmoticons[h].regexp,"$1<span
 class='"+i+"'>$2</span>");}for(var d in this.threeCharacterEmoticons){var 
j=this.threeCharacterEmoticons[d];a=a.replace(j,"$1<span class='"
 +g+"'>$2</span>");}for(var d in this.twoCharacterEmoticons){var 
j=this.twoCharacterEmoticons[d];a=a.replace(j,"$1<span class='"+g+" 
spaced-emoticon'>$2</span>");}if(c.animate)setTimeout(function(){var 
a=document.body.getElementsByClassName("un-transformed-emoticon");for(var b in 
a)if(typeof 
a[b]=="object")a[b].classList.remove("un-transformed-emoticon");},c.delay);return
 a;};

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/ae1b51a9/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/upload/fileinput.min.css
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/upload/fileinput.min.css
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/upload/fileinput.min.css
deleted file mode 100644
index abdd62a..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/upload/fileinput.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap)
- * Copyright 2011-2014 Arnold Daniels.
- * Licensed under the Apache License, Version 2.0 (the "License"); 
(https://github.com/jasny/bootstrap/blob/master/LICENSE)
- */
-
-.btn-labeled{padding-top:0;padding-bottom:0}.btn-label{position:relative;background:transparent;background:rgba(0,0,0,0.15);display:inline-block;padding:6px
 12px;left:-12px;border-radius:3px 0 0 
3px}.btn-label.btn-label-right{left:auto;right:-12px;border-radius:0 3px 3px 
0}.btn-lg .btn-label{padding:10px 16px;left:-16px;border-radius:5px 0 0 
5px}.btn-lg .btn-label.btn-label-right{left:auto;right:-16px;border-radius:0 
5px 5px 0}.btn-sm .btn-label{padding:5px 10px;left:-10px;border-radius:2px 0 0 
2px}.btn-sm .btn-label.btn-label-right{left:auto;right:-10px;border-radius:0 
2px 2px 0}.btn-xs .btn-label{padding:1px 5px;left:-5px;border-radius:2px 0 0 
2px}.btn-xs .btn-label.btn-label-right{left:auto;right:-5px;border-radius:0 2px 
2px 0}.nav-tabs-bottom{border-bottom:0;border-top:1px solid 
#ddd}.nav-tabs-bottom>li{margin-bottom:0;margin-top:-1px}.nav-tabs-bottom>li>a{border-radius:0
 0 4px 
4px}.nav-tabs-bottom>li>a:hover,.nav-tabs-bottom>li>a:focus,.nav-tabs-bottom>li.active>a,.nav-tabs-bot
 tom>li.active>a:hover,.nav-tabs-bottom>li.active>a:focus{border:1px solid 
#ddd;border-top-color:transparent}.nav-tabs-left{border-bottom:0;border-right:1px
 solid 
#ddd}.nav-tabs-left>li{margin-bottom:0;margin-right:-1px;float:none}.nav-tabs-left>li>a{border-radius:4px
 0 0 
4px;margin-right:0;margin-bottom:2px}.nav-tabs-left>li>a:hover,.nav-tabs-left>li>a:focus,.nav-tabs-left>li.active>a,.nav-tabs-left>li.active>a:hover,.nav-tabs-left>li.active>a:focus{border:1px
 solid 
#ddd;border-right-color:transparent}.row>.nav-tabs-left{padding-right:0;padding-left:15px;margin-right:-1px;position:relative;z-index:1}.row>.nav-tabs-left+.tab-content{border-left:1px
 solid #ddd}.nav-tabs-right{border-bottom:0;border-left:1px solid 
#ddd}.nav-tabs-right>li{margin-bottom:0;margin-left:-1px;float:none}.nav-tabs-right>li>a{border-radius:0
 4px 4px 
0;margin-left:0;margin-bottom:2px}.nav-tabs-right>li>a:hover,.nav-tabs-right>li>a:focus,.nav-tabs-right>li.active>a,.nav-tabs-right>li.active>a:hover,.nav-tabs-rig
 ht>li.active>a:focus{border:1px solid 
#ddd;border-left-color:transparent}.row>.nav-tabs-right{padding-left:0;padding-right:15px}.btn-file{overflow:hidden;position:relative;vertical-align:middle}.btn-file>input{position:absolute;top:0;right:0;margin:0;opacity:0;filter:alpha(opacity=0);font-size:23px;height:100%;width:100%;direction:ltr;cursor:pointer}.fileinput{margin-bottom:9px;display:inline-block}.fileinput
 
.form-control{padding-top:7px;padding-bottom:5px;display:inline-block;margin-bottom:0px;vertical-align:middle;cursor:text}.fileinput
 
.thumbnail{overflow:hidden;display:inline-block;margin-bottom:5px;vertical-align:middle;text-align:center}.fileinput
 .thumbnail>img{max-height:100%}.fileinput 
.btn{vertical-align:middle}.fileinput-exists .fileinput-new,.fileinput-new 
.fileinput-exists{display:none}.fileinput-inline 
.fileinput-controls{display:inline}.fileinput-filename{vertical-align:middle;display:inline-block;overflow:hidden}.form-control
 .fileinput-filename{vertical-align:botto
 
m}.fileinput.input-group{display:table}.fileinput.input-group>*{position:relative;z-index:2}.fileinput.input-group>.btn-file{z-index:1}.fileinput-new.input-group
 .btn-file,.fileinput-new .input-group .btn-file{border-radius:0 4px 4px 
0}.fileinput-new.input-group .btn-file.btn-xs,.fileinput-new .input-group 
.btn-file.btn-xs,.fileinput-new.input-group .btn-file.btn-sm,.fileinput-new 
.input-group .btn-file.btn-sm{border-radius:0 3px 3px 
0}.fileinput-new.input-group .btn-file.btn-lg,.fileinput-new .input-group 
.btn-file.btn-lg{border-radius:0 6px 6px 0}.form-group.has-warning .fileinput 
.fileinput-preview{color:#8a6d3b}.form-group.has-warning .fileinput 
.thumbnail{border-color:#faebcc}.form-group.has-error .fileinput 
.fileinput-preview{color:#a94442}.form-group.has-error .fileinput 
.thumbnail{border-color:#ebccd1}.form-group.has-success .fileinput 
.fileinput-preview{color:#3c763d}.form-group.has-success .fileinput 
.thumbnail{border-color:#d6e9c6}.input-group-addon:not(:first-child){bord
 er-left:0}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/ae1b51a9/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/upload/fileinput.min.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/upload/fileinput.min.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/upload/fileinput.min.js
deleted file mode 100644
index 5815e25..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/upload/fileinput.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap)
- * Copyright 2011-2014 Arnold Daniels.
- * Licensed under the Apache License, Version 2.0 (the "License"); 
(https://github.com/jasny/bootstrap/blob/master/LICENSE)
- */
-
-+function(a){"use strict";var b=window.navigator.appName=="Microsoft Internet 
Explorer",c=function(b,c){this.$element=a(b),this.$input=this.$element.find(":file");if(this.$input.length===0)return;this.name=this.$input.attr("name")||c.name,this.$hidden=this.$element.find('input[type=hidden][name="'+this.name+'"]'),this.$hidden.length===0&&(this.$hidden=a('<input
 
type="hidden">').insertBefore(this.$input)),this.$preview=this.$element.find(".fileinput-preview");var
 
d=this.$preview.css("height");this.$preview.css("display")!=="inline"&&d!=="0px"&&d!=="none"&&this.$preview.css("line-height",d),this.original={exists:this.$element.hasClass("fileinput-exists"),preview:this.$preview.html(),hiddenVal:this.$hidden.val()},this.listen()};c.prototype.listen=function(){this.$input.on("change.bs.fileinput",a.proxy(this.change,this)),a(this.$input[0].form).on("reset.bs.fileinput",a.proxy(this.reset,this)),this.$element.find('[data-trigger="fileinput"]').on("click.bs.fileinput",a.proxy(this.trigger,t
 
his)),this.$element.find('[data-dismiss="fileinput"]').on("click.bs.fileinput",a.proxy(this.clear,this))},c.prototype.change=function(b){var
 
c=b.target.files===undefined?b.target&&b.target.value?[{name:b.target.value.replace(/^.+\\/,"")}]:[]:b.target.files;b.stopPropagation();if(c.length===0){this.clear();return}this.$hidden.val(""),this.$hidden.attr("name",""),this.$input.attr("name",this.name);var
 d=c[0];if(this.$preview.length>0&&(typeof 
d.type!="undefined"?d.type.match(/^image\/(gif|png|jpeg)$/):d.name.match(/\.(gif|png|jpe?g)$/i))&&typeof
 FileReader!="undefined"){var e=new 
FileReader,f=this.$preview,g=this.$element;e.onload=function(b){var 
e=a("<img>");e[0].src=b.target.result,c[0].result=b.target.result,g.find(".fileinput-filename").text(d.name),f.css("max-height")!="none"&&e.css("max-height",parseInt(f.css("max-height"),10)-parseInt(f.css("padding-top"),10)-parseInt(f.css("padding-bottom"),10)-parseInt(f.css("border-top"),10)-parseInt(f.css("border-bottom"),10)),f.html(e),g.a
 
ddClass("fileinput-exists").removeClass("fileinput-new"),g.trigger("change.bs.fileinput",c)},e.readAsDataURL(d)}else
 
this.$element.find(".fileinput-filename").text(d.name),this.$preview.text(d.name),this.$element.addClass("fileinput-exists").removeClass("fileinput-new"),this.$element.trigger("change.bs.fileinput")},c.prototype.clear=function(a){a&&a.preventDefault(),this.$hidden.val(""),this.$hidden.attr("name",this.name),this.$input.attr("name","");if(b){var
 
c=this.$input.clone(!0);this.$input.after(c),this.$input.remove(),this.$input=c}else
 
this.$input.val("");this.$preview.html(""),this.$element.find(".fileinput-filename").text(""),this.$element.addClass("fileinput-new").removeClass("fileinput-exists"),a!==undefined&&(this.$input.trigger("change"),this.$element.trigger("clear.bs.fileinput"))},c.prototype.reset=function(){this.clear(),this.$hidden.val(this.original.hiddenVal),this.$preview.html(this.original.preview),this.$element.find(".fileinput-filename").text(""),this.original
 
.exists?this.$element.addClass("fileinput-exists").removeClass("fileinput-new"):this.$element.addClass("fileinput-new").removeClass("fileinput-exists"),this.$element.trigger("reset.bs.fileinput")},c.prototype.trigger=function(a){this.$input.trigger("click"),a.preventDefault()};var
 d=a.fn.fileinput;a.fn.fileinput=function(b){return this.each(function(){var 
d=a(this),e=d.data("bs.fileinput");e||d.data("bs.fileinput",e=new 
c(this,b)),typeof 
b=="string"&&e[b]()})},a.fn.fileinput.Constructor=c,a.fn.fileinput.noConflict=function(){return
 
a.fn.fileinput=d,this},a(document).on("click.fileinput.data-api",'[data-provides="fileinput"]',function(b){var
 c=a(this);if(c.data("bs.fileinput"))return;c.fileinput(c.data());var 
d=a(b.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]');d.length>0&&(b.preventDefault(),d.trigger("click.bs.fileinput"))})}(window.jQuery)

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/ae1b51a9/openmeetings-web/src/main/webapp/css/cssemoticons.css
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/css/cssemoticons.css 
b/openmeetings-web/src/main/webapp/css/cssemoticons.css
new file mode 100644
index 0000000..c14765c
--- /dev/null
+++ b/openmeetings-web/src/main/webapp/css/cssemoticons.css
@@ -0,0 +1,295 @@
+/*
+ * jQuery CSSEmoticons plugin 0.2.9
+ *
+ * Copyright (c) 2010 Steve Schwartz (JangoSteve)
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Date: Sun Oct 22 1:00:00 2010 -0500
+ */
+ 
+ /* Basic styles for emoticons */
+span.css-emoticon {
+  font-family: "Trebuchet MS"; /* seems to give the best and most consistent 
emoticon appearance */
+  font-size: 0.65em;
+  font-weight: bold;
+  color: #000000;
+  display: inline-block;
+  overflow: hidden;
+  vertical-align: middle;
+  transform: rotate(90deg);
+  -webkit-transform: rotate(90deg);
+  -moz-transform: rotate(90deg);
+  -o-transform: rotate(90deg);
+  width: 1.54em; /* note that this is a multiple of this span's font-size, not 
containing text font-size */
+  height: 1.54em; /* so, relative to containing text, width and height are 0.9 
x 1.6 = 1.44em */
+  text-align: center;
+  padding: 0;
+  line-height: 1.34em;
+  -moz-border-radius: 1.54em;
+  -webkit-border-radius: 1.54em;
+  border-radius: 1.54em;
+  -moz-box-shadow: 1px -1px 2px rgba(0,0,0,0.5);
+  -webkit-box-shadow: 1px -1px 2px rgba(0,0,0,0.5);
+  box-shadow: 1px -1px 2px rgba(0,0,0,0.5);
+  border: 1px solid rgba(0,0,0,0.25);
+  background-color: #ffcc00;
+  background-image: -webkit-gradient(
+    linear,
+    right top,
+    left top,
+    color-stop(0.41, rgb(255,204,0)),
+    color-stop(0.56, rgb(255,221,85)),
+    color-stop(1, rgb(255,238,170))
+  );
+  background-image: -moz-linear-gradient(
+    center right,
+    rgb(255,204,0) 41%,
+    rgb(255,221,85) 56%,
+    rgb(255,238,170) 100%
+  );
+  -webkit-transition-property:color, background, transform;  
+  -webkit-transition-duration: 1s, 1s;  
+  -webkit-transition-timing-function: linear, ease-in;
+}
+
+/* Styles for two-character emoticons that need more letter-spacing for 
proportionality */
+span.css-emoticon.spaced-emoticon {
+  padding-left: 0.2em;
+  width: 1.34em;
+  letter-spacing: 0.2em;
+}
+
+/* This is a dirty dirty hack, because webkit doesn't properly do the 
padding+width=total-width as it should
+   I think the width of the border may be throwing things off, because it's 
more noticable for small icons */
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+  span.css-emoticon.spaced-emoticon {
+    width: 1.4em;
+  }
+}
+
+/* Styles for emoticons that need to have smaller characters to fit inside the 
circle */
+span.css-emoticon.small-emoticon {
+  font-size: 0.55em;
+  width: 1.82em;
+  height: 1.82em;
+  line-height: 1.72em;
+  -moz-border-radius: 1.82em;
+  -webkit-border-radius: 1.82em;
+  border-radius: 1.82em;
+}
+
+span.css-emoticon.small-emoticon.spaced-emoticon {
+  padding-left: 0;
+  width: 1.82em;
+  letter-spacing: 0.1em;
+}
+
+/* Styles for additional colors */
+span.css-emoticon.red-emoticon {
+  background-color: #eb0542;
+  background-image: -webkit-gradient(
+    linear,
+    right top,
+    left top,
+    color-stop(0.41, rgb(235,5,66)),
+    color-stop(0.56, rgb(235,38,90)),
+    color-stop(1, rgb(250,55,110))
+  );
+  background-image: -moz-linear-gradient(
+    center right,
+    rgb(235,5,66) 41%,
+    rgb(235,38,90) 56%,
+    rgb(250,55,110) 100%
+  );
+}
+
+span.css-emoticon.pink-emoticon {
+  background-color: #ff8fd4;
+  background-image: -webkit-gradient(
+    linear,
+    right top,
+    left top,
+    color-stop(0.41, rgb(255,143,212)),
+    color-stop(0.56, rgb(255,153,216)),
+    color-stop(1,    rgb(255,173,225))
+  );
+  background-image: -moz-linear-gradient(
+    center right,
+    rgb(255,143,212) 41%,
+    rgb(255,153,216) 56%,
+    rgb(255,173,225) 100%
+  );
+}
+
+/* styles for emoticons that need no rotation, like O_o */
+span.css-emoticon.no-rotate { 
+  transform: rotate(0deg);
+  -webkit-transform: rotate(0deg);
+  -moz-transform: rotate(0deg);
+  -o-transform: rotate(0deg);
+  -moz-box-shadow: 1px 1px 2px rgba(0,0,0,0.5);
+  -webkit-box-shadow: 1px 1px 2px rgba(0,0,0,0.5);
+  box-shadow: 1px 1px 2px rgba(0,0,0,0.5);
+  font-size: 0.45em;
+  width: 2.2em;
+  height: 2.2em;
+  line-height: 1.9em;
+  -moz-border-radius: 2.2em;
+  -webkit-border-radius: 2.2em;
+  border-radius: 2.2em;
+  background-image: -webkit-gradient(
+    linear,
+    right bottom,
+    right top,
+    color-stop(0.41, rgb(255,204,0)),
+    color-stop(0.56, rgb(255,221,85)),
+    color-stop(1, rgb(255,238,170))
+  );
+  background-image: -moz-linear-gradient(
+    center bottom,
+    rgb(255,204,0) 41%,
+    rgb(255,221,85) 56%,
+    rgb(255,238,170) 100%
+  );
+}
+
+span.css-emoticon.no-rotate.red-emoticon {
+  background-image: -webkit-gradient(
+    linear,
+    right bottom,
+    right top,
+    color-stop(0.41, rgb(235,5,66)),
+    color-stop(0.56, rgb(235,38,90)),
+    color-stop(1, rgb(250,55,110))
+  );
+  background-image: -moz-linear-gradient(
+    center bottom,
+    rgb(235,5,66) 41%,
+    rgb(235,38,90) 56%,
+    rgb(250,55,110) 100%
+  );
+}
+
+span.css-emoticon.no-rotate.pink-emoticon {
+  background-image: -webkit-gradient(
+    linear,
+    right bottom,
+    right top,
+    color-stop(0.41, rgb(255,143,212)),
+    color-stop(0.56, rgb(255,153,216)),
+    color-stop(1,    rgb(255,173,225))
+  );
+  background-image: -moz-linear-gradient(
+    center bottom,
+    rgb(255,143,212) 41%,
+    rgb(255,153,216) 56%,
+    rgb(255,173,225) 100%
+  );
+}
+
+/* Styles for emoticons that need to be rotated counter-clockwise, like <3 */
+span.css-emoticon.counter-rotated { 
+  transform: rotate(-90deg);
+  -webkit-transform: rotate(-90deg);
+  -moz-transform: rotate(-90deg);
+  -o-transform: rotate(-90deg);
+  -moz-box-shadow: -1px 1px 2px rgba(0,0,0,0.5);
+  -webkit-box-shadow: -1px 1px 2px rgba(0,0,0,0.5);
+  box-shadow: -1px 1px 2px rgba(0,0,0,0.5);
+  background-image: -webkit-gradient(
+    linear,
+    left top,
+    right top,
+    color-stop(0.41, rgb(255,204,0)),
+    color-stop(0.56, rgb(255,221,85)),
+    color-stop(1, rgb(255,238,170))
+  );
+  background-image: -moz-linear-gradient(
+    center left,
+    rgb(255,204,0) 41%,
+    rgb(255,221,85) 56%,
+    rgb(255,238,170) 100%
+  );
+}
+
+span.css-emoticon.counter-rotated.red-emoticon {
+  background-image: -webkit-gradient(
+    linear,
+    left top,
+    right top,
+    color-stop(0.41, rgb(235,5,66)),
+    color-stop(0.56, rgb(235,38,90)),
+    color-stop(1, rgb(250,55,110))
+  );
+  background-image: -moz-linear-gradient(
+    center left,
+    rgb(235,5,66) 41%,
+    rgb(235,38,90) 56%,
+    rgb(250,55,110) 100%
+  );
+}
+
+span.css-emoticon.counter-rotated.pink-emoticon {
+  background-image: -webkit-gradient(
+    linear,
+    left top,
+    right top,
+    color-stop(0.41, rgb(255,143,212)),
+    color-stop(0.56, rgb(255,153,216)),
+    color-stop(1,    rgb(255,173,225))
+  );
+  background-image: -moz-linear-gradient(
+    center left,
+    rgb(255,143,212) 41%,
+    rgb(255,153,216) 56%,
+    rgb(255,173,225) 100%
+  );
+}
+
+/* Styles for animated states */
+span.css-emoticon.un-transformed-emoticon, 
span.css-emoticon.animated-emoticon:hover {
+    /* font-size: inherit;
+    font-weight: inherit;
+    vertical-align: inherit;
+    line-height: inherit;
+    font-family: inherit; */
+    letter-spacing: inherit;
+    color: inherit;
+    overflow: visible;
+    transform: rotate(0deg);
+    -webkit-transform: rotate(0deg);
+    -moz-transform: rotate(0deg);
+    -o-transform: rotate(0deg);
+    background: none;
+    background-image: none;
+    box-shadow: none;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    border-color: transparent;
+}
+
+span.css-emoticon.nintendo-controller {
+  font-size: .8em;
+  height: 1.2em;
+  line-height: 1em;
+  width: 2.7em;
+  vertical-align: bottom;
+  border-radius: 0;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  background: -webkit-gradient(
+      linear,
+      left bottom,
+      left top,
+      color-stop(0.09, rgb(116,121,140)),
+      color-stop(0.55, rgb(165,170,189))
+  );
+  background: -moz-linear-gradient(
+      center bottom,
+      rgb(116,121,140) 9%,
+      rgb(165,170,189) 55%
+  );
+}
\ No newline at end of file

Reply via email to