From 6c69cdffcca0e15d4f372950688f3f5a460a9c89 Mon Sep 17 00:00:00 2001 From: Alexander Yakovlev Date: Sat, 20 Feb 2016 11:14:40 +0700 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=20=D0=BD=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=20candy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- candy-plugins/chatrecall/README.md | 30 + candy-plugins/chatrecall/candy.js | 116 +++ candy-plugins/colors-xhtml/README.md | 43 ++ candy-plugins/colors-xhtml/candy.css | 33 + candy-plugins/colors-xhtml/candy.js | 96 +++ candy-plugins/colors-xhtml/colors-control.png | Bin 0 -> 816 bytes candy-plugins/colors/README.md | 29 + candy-plugins/colors/candy.css | 97 +++ candy-plugins/colors/candy.js | 87 +++ candy-plugins/colors/colors-control.png | Bin 0 -> 816 bytes candy-plugins/emphasis/README.md | 78 ++ candy-plugins/emphasis/candy.js | 86 +++ candy-plugins/lefttabs/README.md | 24 + candy-plugins/lefttabs/lefttabs.css | 239 +++++++ candy-plugins/lefttabs/lefttabs.js | 104 +++ candy-plugins/me-does/README.md | 31 + candy-plugins/me-does/candy.js | 47 ++ candy-plugins/modify-role/README.md | 29 + candy-plugins/modify-role/add-moderator.png | Bin 0 -> 3678 bytes candy-plugins/modify-role/candy.css | 6 + candy-plugins/modify-role/candy.js | 97 +++ .../modify-role/remove-moderator.png | Bin 0 -> 3672 bytes candy-plugins/namecomplete/README.md | 31 + candy-plugins/namecomplete/candy.css | 7 + candy-plugins/namecomplete/candy.js | 260 +++++++ candy-plugins/nickchange/README.md | 26 + candy-plugins/nickchange/candy.css | 3 + candy-plugins/nickchange/candy.js | 63 ++ .../nickchange/nickchange-control.png | Bin 0 -> 273 bytes candy-plugins/notifications/README.md | 29 + candy-plugins/notifications/candy.js | 111 +++ candy-plugins/replies/README.md | 29 + candy-plugins/replies/candy.css | 4 + candy-plugins/replies/candy.js | 50 ++ candy.min.js | 4 + index.html | 69 ++ libs.min.js | 3 + res/audioplayer.swf | Bin 0 -> 2680 bytes res/default.css | 674 ++++++++++++++++++ res/img/action/autoscroll-off.png | Bin 0 -> 442 bytes res/img/action/autoscroll-on.png | Bin 0 -> 223 bytes res/img/action/ban.png | Bin 0 -> 796 bytes res/img/action/emoticons.png | Bin 0 -> 725 bytes res/img/action/ignore.png | Bin 0 -> 715 bytes res/img/action/kick.png | Bin 0 -> 859 bytes res/img/action/menu.png | Bin 0 -> 1229 bytes res/img/action/private.png | Bin 0 -> 557 bytes res/img/action/settings.png | Bin 0 -> 744 bytes res/img/action/sound-off.png | Bin 0 -> 3172 bytes res/img/action/sound-on.png | Bin 0 -> 544 bytes res/img/action/statusmessage-off.png | Bin 0 -> 764 bytes res/img/action/statusmessage-on.png | Bin 0 -> 659 bytes res/img/action/subject.png | Bin 0 -> 413 bytes res/img/action/unignore.png | Bin 0 -> 781 bytes res/img/action/usercount.png | Bin 0 -> 753 bytes res/img/emoticons/Angel.png | Bin 0 -> 3467 bytes res/img/emoticons/Angry.png | Bin 0 -> 3449 bytes res/img/emoticons/Aww.png | Bin 0 -> 3352 bytes res/img/emoticons/Aww_2.png | Bin 0 -> 3402 bytes res/img/emoticons/Blushing.png | Bin 0 -> 3403 bytes res/img/emoticons/Childish.png | Bin 0 -> 3411 bytes res/img/emoticons/Confused.png | Bin 0 -> 3392 bytes res/img/emoticons/Creepy.png | Bin 0 -> 3417 bytes res/img/emoticons/Crying.png | Bin 0 -> 3434 bytes res/img/emoticons/Cthulhu.png | Bin 0 -> 775 bytes res/img/emoticons/Cute.png | Bin 0 -> 3369 bytes res/img/emoticons/Cute_Winking.png | Bin 0 -> 3380 bytes res/img/emoticons/Devil.png | Bin 0 -> 3478 bytes res/img/emoticons/Gah.png | Bin 0 -> 3415 bytes res/img/emoticons/Gah_2.png | Bin 0 -> 3401 bytes res/img/emoticons/Gasping.png | Bin 0 -> 3384 bytes res/img/emoticons/Greedy.png | Bin 0 -> 3456 bytes res/img/emoticons/Grinning.png | Bin 0 -> 3381 bytes res/img/emoticons/Grinning_Winking.png | Bin 0 -> 3394 bytes res/img/emoticons/Happy.png | Bin 0 -> 3413 bytes res/img/emoticons/Happy_2.png | Bin 0 -> 3433 bytes res/img/emoticons/Happy_3.png | Bin 0 -> 3408 bytes res/img/emoticons/Heart.png | Bin 0 -> 3209 bytes res/img/emoticons/Huh.png | Bin 0 -> 3417 bytes res/img/emoticons/Huh_2.png | Bin 0 -> 3429 bytes res/img/emoticons/Laughing.png | Bin 0 -> 3450 bytes res/img/emoticons/Lips_Sealed.png | Bin 0 -> 3368 bytes res/img/emoticons/Madness.png | Bin 0 -> 3418 bytes res/img/emoticons/Malicious.png | Bin 0 -> 751 bytes res/img/emoticons/README | 2 + res/img/emoticons/Sick.png | Bin 0 -> 3439 bytes res/img/emoticons/Smiling.png | Bin 0 -> 3390 bytes res/img/emoticons/Speechless.png | Bin 0 -> 3352 bytes res/img/emoticons/Spiteful.png | Bin 0 -> 3417 bytes res/img/emoticons/Stupid.png | Bin 0 -> 3422 bytes res/img/emoticons/Sunglasses.png | Bin 0 -> 3433 bytes res/img/emoticons/Terrified.png | Bin 0 -> 3382 bytes res/img/emoticons/Thumb_Down.png | Bin 0 -> 572 bytes res/img/emoticons/Thumb_Up.png | Bin 0 -> 530 bytes res/img/emoticons/Tired.png | Bin 0 -> 3338 bytes res/img/emoticons/Tongue_Out.png | Bin 0 -> 3403 bytes res/img/emoticons/Tongue_Out_Laughing.png | Bin 0 -> 3468 bytes res/img/emoticons/Tongue_Out_Left.png | Bin 0 -> 3387 bytes res/img/emoticons/Tongue_Out_Up.png | Bin 0 -> 3362 bytes res/img/emoticons/Tongue_Out_Up_Left.png | Bin 0 -> 704 bytes res/img/emoticons/Tongue_Out_Winking.png | Bin 0 -> 3416 bytes res/img/emoticons/Uncertain.png | Bin 0 -> 3390 bytes res/img/emoticons/Uncertain_2.png | Bin 0 -> 3378 bytes res/img/emoticons/Unhappy.png | Bin 0 -> 3408 bytes res/img/emoticons/Winking.png | Bin 0 -> 3404 bytes res/img/favicon.png | Bin 0 -> 490 bytes res/img/modal-spinner.gif | Bin 0 -> 723 bytes res/img/overlay.png | Bin 0 -> 109 bytes res/img/roster/affiliation-owner.png | Bin 0 -> 670 bytes res/img/roster/ignore.png | Bin 0 -> 715 bytes res/img/roster/role-moderator.png | Bin 0 -> 594 bytes res/img/tab-transitions.png | Bin 0 -> 151 bytes res/img/tooltip-arrows.gif | Bin 0 -> 66 bytes res/notify.mp3 | Bin 0 -> 1095 bytes 114 files changed, 2637 insertions(+) create mode 100644 candy-plugins/chatrecall/README.md create mode 100644 candy-plugins/chatrecall/candy.js create mode 100644 candy-plugins/colors-xhtml/README.md create mode 100644 candy-plugins/colors-xhtml/candy.css create mode 100644 candy-plugins/colors-xhtml/candy.js create mode 100644 candy-plugins/colors-xhtml/colors-control.png create mode 100644 candy-plugins/colors/README.md create mode 100644 candy-plugins/colors/candy.css create mode 100644 candy-plugins/colors/candy.js create mode 100644 candy-plugins/colors/colors-control.png create mode 100644 candy-plugins/emphasis/README.md create mode 100644 candy-plugins/emphasis/candy.js create mode 100644 candy-plugins/lefttabs/README.md create mode 100644 candy-plugins/lefttabs/lefttabs.css create mode 100644 candy-plugins/lefttabs/lefttabs.js create mode 100644 candy-plugins/me-does/README.md create mode 100644 candy-plugins/me-does/candy.js create mode 100644 candy-plugins/modify-role/README.md create mode 100644 candy-plugins/modify-role/add-moderator.png create mode 100644 candy-plugins/modify-role/candy.css create mode 100644 candy-plugins/modify-role/candy.js create mode 100644 candy-plugins/modify-role/remove-moderator.png create mode 100644 candy-plugins/namecomplete/README.md create mode 100644 candy-plugins/namecomplete/candy.css create mode 100644 candy-plugins/namecomplete/candy.js create mode 100644 candy-plugins/nickchange/README.md create mode 100644 candy-plugins/nickchange/candy.css create mode 100644 candy-plugins/nickchange/candy.js create mode 100644 candy-plugins/nickchange/nickchange-control.png create mode 100644 candy-plugins/notifications/README.md create mode 100644 candy-plugins/notifications/candy.js create mode 100644 candy-plugins/replies/README.md create mode 100644 candy-plugins/replies/candy.css create mode 100644 candy-plugins/replies/candy.js create mode 100644 candy.min.js create mode 100644 index.html create mode 100644 libs.min.js create mode 100644 res/audioplayer.swf create mode 100644 res/default.css create mode 100644 res/img/action/autoscroll-off.png create mode 100644 res/img/action/autoscroll-on.png create mode 100644 res/img/action/ban.png create mode 100644 res/img/action/emoticons.png create mode 100644 res/img/action/ignore.png create mode 100644 res/img/action/kick.png create mode 100644 res/img/action/menu.png create mode 100644 res/img/action/private.png create mode 100644 res/img/action/settings.png create mode 100644 res/img/action/sound-off.png create mode 100644 res/img/action/sound-on.png create mode 100644 res/img/action/statusmessage-off.png create mode 100644 res/img/action/statusmessage-on.png create mode 100644 res/img/action/subject.png create mode 100644 res/img/action/unignore.png create mode 100644 res/img/action/usercount.png create mode 100644 res/img/emoticons/Angel.png create mode 100644 res/img/emoticons/Angry.png create mode 100644 res/img/emoticons/Aww.png create mode 100644 res/img/emoticons/Aww_2.png create mode 100644 res/img/emoticons/Blushing.png create mode 100644 res/img/emoticons/Childish.png create mode 100644 res/img/emoticons/Confused.png create mode 100644 res/img/emoticons/Creepy.png create mode 100644 res/img/emoticons/Crying.png create mode 100644 res/img/emoticons/Cthulhu.png create mode 100644 res/img/emoticons/Cute.png create mode 100644 res/img/emoticons/Cute_Winking.png create mode 100644 res/img/emoticons/Devil.png create mode 100644 res/img/emoticons/Gah.png create mode 100644 res/img/emoticons/Gah_2.png create mode 100644 res/img/emoticons/Gasping.png create mode 100644 res/img/emoticons/Greedy.png create mode 100644 res/img/emoticons/Grinning.png create mode 100644 res/img/emoticons/Grinning_Winking.png create mode 100644 res/img/emoticons/Happy.png create mode 100644 res/img/emoticons/Happy_2.png create mode 100644 res/img/emoticons/Happy_3.png create mode 100644 res/img/emoticons/Heart.png create mode 100644 res/img/emoticons/Huh.png create mode 100644 res/img/emoticons/Huh_2.png create mode 100644 res/img/emoticons/Laughing.png create mode 100644 res/img/emoticons/Lips_Sealed.png create mode 100644 res/img/emoticons/Madness.png create mode 100644 res/img/emoticons/Malicious.png create mode 100644 res/img/emoticons/README create mode 100644 res/img/emoticons/Sick.png create mode 100644 res/img/emoticons/Smiling.png create mode 100644 res/img/emoticons/Speechless.png create mode 100644 res/img/emoticons/Spiteful.png create mode 100644 res/img/emoticons/Stupid.png create mode 100644 res/img/emoticons/Sunglasses.png create mode 100644 res/img/emoticons/Terrified.png create mode 100644 res/img/emoticons/Thumb_Down.png create mode 100644 res/img/emoticons/Thumb_Up.png create mode 100644 res/img/emoticons/Tired.png create mode 100644 res/img/emoticons/Tongue_Out.png create mode 100644 res/img/emoticons/Tongue_Out_Laughing.png create mode 100644 res/img/emoticons/Tongue_Out_Left.png create mode 100644 res/img/emoticons/Tongue_Out_Up.png create mode 100644 res/img/emoticons/Tongue_Out_Up_Left.png create mode 100644 res/img/emoticons/Tongue_Out_Winking.png create mode 100644 res/img/emoticons/Uncertain.png create mode 100644 res/img/emoticons/Uncertain_2.png create mode 100644 res/img/emoticons/Unhappy.png create mode 100644 res/img/emoticons/Winking.png create mode 100644 res/img/favicon.png create mode 100644 res/img/modal-spinner.gif create mode 100644 res/img/overlay.png create mode 100644 res/img/roster/affiliation-owner.png create mode 100644 res/img/roster/ignore.png create mode 100644 res/img/roster/role-moderator.png create mode 100644 res/img/tab-transitions.png create mode 100644 res/img/tooltip-arrows.gif create mode 100644 res/notify.mp3 diff --git a/candy-plugins/chatrecall/README.md b/candy-plugins/chatrecall/README.md new file mode 100644 index 0000000..66534a7 --- /dev/null +++ b/candy-plugins/chatrecall/README.md @@ -0,0 +1,30 @@ +# Chat recall plugin +This plugin will allow the user to navigate through historical messages they've typed using the up and down keys + +## Usage +Include the JavaScript file: + +```HTML + +``` + +Call its `init()` method after Candy has been initialized: + +```JavaScript +Candy.init('/http-bind/'); + +CandyShop.ChatRecall.init(); + +Candy.Core.connect(); +``` + +## Configuration options +`messagesToKeep` - Integer - The number of messages to store in history. Defaults to 10 + +## Example configurations +```JavaScript +// Store 25 messages for the user to scroll through +CandyShop.ChatRecall.init({ + messagesToKeep: 25 +}); +``` \ No newline at end of file diff --git a/candy-plugins/chatrecall/candy.js b/candy-plugins/chatrecall/candy.js new file mode 100644 index 0000000..2e2e1d7 --- /dev/null +++ b/candy-plugins/chatrecall/candy.js @@ -0,0 +1,116 @@ +/** File: candy.js + * Candy - Chats are not dead yet. + * + * Authors: + * - Troy McCabe + * + * Copyright: + * (c) 2012 Geek Squad. All rights reserved. + */ + +/* global document, Candy, jQuery */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +/** Class: CandyShop.ChatRecall + * Remembers the last {x} messages the user types and allows up and down key recollection + */ +CandyShop.ChatRecall = (function(self, Candy, $) { + /** Object: _options + * Options: + * (Integer) messagesToKeep - How many messages to keep in memory + */ + var _options = { + messagesToKeep: 10 + }; + + /** Array: _messages + * The messages that the user sent + */ + var _messages = []; + + /** Integer: _currentMessageIndex + * The current index of the message the user went back to + */ + var _currentMessageIndex = 0; + + /** Function: init + * Initialize the ChatRecall plugin + * + * Parameters: + * (Object) options - An options packet to apply to this plugin + */ + self.init = function(options) { + // apply the supplied options to the defaults specified + $.extend(true, _options, options); + + // Listen for keydown in the field + $(document).on('keydown', 'input[name="message"]', function(e) { + // switch on the key code + switch (e.which) { + // up arrow + case 38: + // if we're under the cap of max messages and the cap of the messages currently stored, recall + if (_currentMessageIndex < _options.messagesToKeep && _currentMessageIndex < _messages.length) { + // if we're at blank (the bottom), move it up to 0 + if (_currentMessageIndex === -1) { + _currentMessageIndex++; + } + // set the value to what we stored + $(this).val(_messages[_currentMessageIndex]); + // if we're under the limits, go ahead and move the tracked position up + if (_currentMessageIndex < _options.messagesToKeep - 1 && _currentMessageIndex < _messages.length - 1) { + _currentMessageIndex++; + } + } + break; + + // down arrow + case 40: + // if we're back to the bottom, clear the field + // else move it down + if (_currentMessageIndex === -1) { + $(this).val(''); + } else { + // if we're at the cap already, move it down initially (don't want to have to hit it twice) + if (_currentMessageIndex === _options.messagesToKeep - 1 || _currentMessageIndex === _messages.length - 1) { + _currentMessageIndex--; + } + // set the value to the one that's stored + $(this).val(_messages[_currentMessageIndex]); + + if (_currentMessageIndex > -1) { + // move the tracked position down + _currentMessageIndex--; + } + } + break; + } + }); + + // listen before send and add it to the stack + $(Candy).on('candy:view.message.before-send', function(e, data) { + // remove, in case there is the colors plugin, the |c:number| prefix + self.addMessage(data.message.replace(/\|c:\d+\|/i, '')); + }); + }; + + /** Function: addMessage + * Add a message to the front of the stack + * This is stored New[0] -> Old[N] + * + * Parameters: + * (String) message - The message to store + */ + self.addMessage = function(message) { + // pop one off the end if it's too many + if (_messages.length === _options.messagesToKeep) { + _messages.pop(); + } + + // put the message at pos 0 and move everything else + _messages.unshift(message); + }; + + return self; +}(CandyShop.ChatRecall || {}, Candy, jQuery)); diff --git a/candy-plugins/colors-xhtml/README.md b/candy-plugins/colors-xhtml/README.md new file mode 100644 index 0000000..da86a1f --- /dev/null +++ b/candy-plugins/colors-xhtml/README.md @@ -0,0 +1,43 @@ +# Colors using XHTML formatted messages +Send and receive colored messages. +This plugin is based on the [colors](https://github.com/candy-chat/candy-plugins/tree/master/colors) and, contrary +to the `colors` plugin, ensures that third party clients see the colors as well. + +![Color Picker](screenshot.png) + +## Usage +To enable *Colors* you have to include its JavaScript code and stylesheet + +```HTML + + +``` + +Call its `init()` method after Candy has been initialized: + +```javascript +Candy.init('/http-bind/', { + view: { + // make sure you enabled XHTML in order to display it properly. + enableXHTML: true + } +}); + +// enable Colors-XHTML plugin (default: 8 colors) +CandyShop.ColorsXhtml.init(); + +Candy.Core.connect(); +``` + +To enable less or more colors enable it with e.g.: + +```javascript +var colors = [ + '#333', '#fff' + // etc, use as many as you'd like to +]; + +CandyShop.ColorsXhtml.init(colors); +``` + +**Please note**: you can't use the `colors` and the `colors-xhtml` plugin together. \ No newline at end of file diff --git a/candy-plugins/colors-xhtml/candy.css b/candy-plugins/colors-xhtml/candy.css new file mode 100644 index 0000000..4d45c16 --- /dev/null +++ b/candy-plugins/colors-xhtml/candy.css @@ -0,0 +1,33 @@ +#colors-control { + background: no-repeat url('colors-control.png'); + position: relative; +} + +#colors-control-indicator { + display: inline-block; + height: 6px; + width: 6px; + border: 1px solid white; + position: absolute; + top: 100%; + left: 100%; + margin: -8px 0 0 -8px; +} + +#context-menu .colors { + padding-left: 5px; + width: 89px; + white-space: normal; +} + +#context-menu .colors:hover { + background-color: inherit; +} + +#context-menu .colors span { + display: inline-block; + width: 14px; + height: 14px; + border: 1px solid white; + margin: 3px; +} \ No newline at end of file diff --git a/candy-plugins/colors-xhtml/candy.js b/candy-plugins/colors-xhtml/candy.js new file mode 100644 index 0000000..90531b6 --- /dev/null +++ b/candy-plugins/colors-xhtml/candy.js @@ -0,0 +1,96 @@ +/* global Candy, jQuery */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +CandyShop.ColorsXhtml = (function(self, Candy, $) { + + var _numColors, + _currentColor = '', + _colors = [ + '#333', + '#c4322b', + '#37991e', + '#1654c9', + '#66379b', + '#ba7318', + '#32938a', + '#9e2274' + ]; + + self.init = function(colors) { + if(colors && colors.length) { + _colors = colors; + } + _numColors = _colors.length; + + self.applyTranslations(); + + $(Candy).on('candy:view.message.before-send', function(e, args) { + if(_currentColor !== '' && $.trim(args.message) !== '') { + args.xhtmlMessage = '' + Candy.Util.Parser.escape(args.message) + ''; + } + }); + + if(Candy.Util.cookieExists('candyshop-colors-xhtml-current')) { + var color = Candy.Util.getCookie('candyshop-colors-xhtml-current'); + if(_colors.indexOf(color) !== -1) { + _currentColor = color; + } + } + var html = '
  • '; + $('#emoticons-icon').after(html); + $('#colors-control').click(function() { + CandyShop.ColorsXhtml.showPicker(this); + }); + }; + + self.showPicker = function(elem) { + elem = $(elem); + var pos = elem.offset(), + menu = $('#context-menu'), + content = $('ul', menu), + colors = '', + i; + + $('#tooltip').hide(); + + for(i = _numColors-1; i >= 0; i--) { + colors = '' + colors; + } + content.html('
  • ' + colors + '
  • '); + content.find('span').click(function() { + _currentColor = $(this).attr('data-color'); + $('#colors-control-indicator').attr('style', 'color:' + _currentColor + ';background-color:' + _currentColor); + Candy.Util.setCookie('candyshop-colors-xhtml-current', _currentColor, 365); + Candy.View.Pane.Room.setFocusToForm(Candy.View.getCurrent().roomJid); + menu.hide(); + }); + + var posLeft = Candy.Util.getPosLeftAccordingToWindowBounds(menu, pos.left), + posTop = Candy.Util.getPosTopAccordingToWindowBounds(menu, pos.top); + + menu.css({'left': posLeft.px, 'top': posTop.px, backgroundPosition: posLeft.backgroundPositionAlignment + ' ' + posTop.backgroundPositionAlignment}); + menu.fadeIn('fast'); + + return true; + }; + + self.applyTranslations = function() { + var translations = { + 'en' : 'Message Color', + 'ru' : 'Цвет сообщения', + 'de' : 'Farbe für Nachrichten', + 'fr' : 'Couleur des messages', + 'nl' : 'Berichtkleur', + 'es' : 'Color de los mensajes' + }; + $.each(translations, function(k, v) { + if(Candy.View.Translation[k]) { + Candy.View.Translation[k].candyshopColorsXhtmlMessagecolor = v; + } + + }); + }; + + return self; +}(CandyShop.ColorsXhtml || {}, Candy, jQuery)); diff --git a/candy-plugins/colors-xhtml/colors-control.png b/candy-plugins/colors-xhtml/colors-control.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2ef7b3817c051aefe80e3972f9243b5b4bae50 GIT binary patch literal 816 zcmV-01JC@4P)+Xr*;oV2oovvnCMUa)?wbr6l z=Id@|jCFCCx5zyPwuu4C!Cbi1sT{w5uD(-k@_UHZB6O^wj&8%AFjVWBYU*Q`ne()n zmlBt_jzy8~gnu~gZSwwmy`f&!2?Q|C;wZoc4@#v~8yBC(^RO=i+~SmhDP5u!$LDax0k z-OR$4MOeCDr~v43F=^Te$|>?CkN^d`4PrtvdmRs|mK%X|2FQ{_IE;MkCyb(hp#q?N zmqwCCsiRdCFgis8Ql1k6QHgO4b=af%!Q%BmF$23s!rI`6ysdkOD_t-a@ZiO;zREQl z4W!lFM<6*4{F+7qHd<9NL4WZy9J~=|Rrr=M@0V7rrDu6>j%GOIfwd!jU$h znzCm#k|0M3BE;yRio{|b^Mmnm0sfl;A}bprE*aoOJbX8lwPGWwJEyySO&!}+REH&) zB?r^FEPlLMhB+B~spP~PGL#wW-KJ5NNNJIthmA+cMB)8Fzjl7g>zsSk+dVSHF uY&C>|5crS}?lecaJ + +``` + +Call its `init()` method after Candy has been initialized: + +```JavaScript +Candy.init('/http-bind/'); + +// enable Colors plugin (default: 8 colors) +CandyShop.Colors.init(); + +Candy.Core.connect(); +``` + +To enable less or more colors just call `CandyShop.Colors.init()`. diff --git a/candy-plugins/colors/candy.css b/candy-plugins/colors/candy.css new file mode 100644 index 0000000..1b6ec8f --- /dev/null +++ b/candy-plugins/colors/candy.css @@ -0,0 +1,97 @@ +#colors-control { + background: no-repeat url('colors-control.png'); + position: relative; +} + +#colors-control-indicator { + display: inline-block; + height: 6px; + width: 6px; + border: 1px solid white; + position: absolute; + top: 100%; + left: 100%; + margin: -8px 0 0 -8px; +} + +#context-menu .colors { + padding-left: 5px; + width: 89px; + white-space: normal; +} + +#context-menu .colors:hover { + background-color: inherit; +} + +#context-menu .colors span { + display: inline-block; + width: 14px; + height: 14px; + border: 1px solid white; + margin: 3px; +} + +.message-pane span.colored { + background-color: transparent !important; +} + +.color-0 { + color: #333; + background-color: #333; +} + +.color-1 { + color: #c4322b; + background-color: #c4322b; +} + +.color-2 { + color: #37991e; + background-color: #37991e; +} + +.color-3 { + color: #1654c9; + background-color: #1654c9; +} + +.color-4 { + color: #66379b; + background-color: #66379b; +} + +.color-5 { + color: #ba7318; + background-color: #ba7318; +} + +.color-6 { + color: #32938a; + background-color: #32938a; +} + +.color-7 { + color: #9e2274; + background-color: #9e2274; +} + +.color-8 { + color: #4C82E4; + background-color: #4C82E4; +} + +.color-9 { + color: #7F140E; + background-color: #7F140E; +} + +.color-10 { + color: #1C630A; + background-color: #1C630A; +} + +.color-11 { + color: #CF55A4; + background-color: #CF55A4; +} \ No newline at end of file diff --git a/candy-plugins/colors/candy.js b/candy-plugins/colors/candy.js new file mode 100644 index 0000000..8361c39 --- /dev/null +++ b/candy-plugins/colors/candy.js @@ -0,0 +1,87 @@ +/* global Candy, jQuery */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +CandyShop.Colors = (function(self, Candy, $) { + + var _numColors, + _currentColor = 0; + + self.init = function(numColors) { + _numColors = numColors ? numColors : 8; + + self.applyTranslations(); + + $(Candy).on('candy:view.message.before-send', function(e, args) { + if(_currentColor > 0 && $.trim(args.message) !== '') { + args.message = '|c:'+ _currentColor +'|' + args.message; + } + }); + + $(Candy).on('candy:view.message.before-render', function(e, args) { + args.templateData.message = args.templateData.message.replace(/^\|c:([0-9]{1,2})\|(.*)/gm, '$2'); + }); + + if(Candy.Util.cookieExists('candyshop-colors-current')) { + var color = parseInt(Candy.Util.getCookie('candyshop-colors-current'), 10); + if(color > 0 && color < _numColors) { + _currentColor = color; + } + } + var html = '
  • '; + $('#emoticons-icon').after(html); + $('#colors-control').click(function() { + CandyShop.Colors.showPicker(this); + }); + }; + + self.showPicker = function(elem) { + elem = $(elem); + var pos = elem.offset(), + menu = $('#context-menu'), + content = $('ul', menu), + colors = '', + i; + + $('#tooltip').hide(); + + for(i = _numColors-1; i >= 0; i--) { + colors = '' + colors; + } + content.html('
  • ' + colors + '
  • '); + content.find('span').click(function() { + _currentColor = $(this).attr('data-color'); + $('#colors-control-indicator').attr('class', 'color-' + _currentColor); + Candy.Util.setCookie('candyshop-colors-current', _currentColor, 365); + Candy.View.Pane.Room.setFocusToForm(Candy.View.getCurrent().roomJid); + menu.hide(); + }); + + var posLeft = Candy.Util.getPosLeftAccordingToWindowBounds(menu, pos.left), + posTop = Candy.Util.getPosTopAccordingToWindowBounds(menu, pos.top); + + menu.css({'left': posLeft.px, 'top': posTop.px, backgroundPosition: posLeft.backgroundPositionAlignment + ' ' + posTop.backgroundPositionAlignment}); + menu.fadeIn('fast'); + + return true; + }; + + self.applyTranslations = function() { + var translations = { + 'en' : 'Message Color', + 'ru' : 'Цвет сообщения', + 'de' : 'Farbe für Nachrichten', + 'fr' : 'Couleur des messages', + 'nl' : 'Berichtkleur', + 'es' : 'Color de los mensajes' + }; + $.each(translations, function(k, v) { + if(Candy.View.Translation[k]) { + Candy.View.Translation[k].candyshopColorsMessagecolor = v; + } + + }); + }; + + return self; +}(CandyShop.Colors || {}, Candy, jQuery)); diff --git a/candy-plugins/colors/colors-control.png b/candy-plugins/colors/colors-control.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2ef7b3817c051aefe80e3972f9243b5b4bae50 GIT binary patch literal 816 zcmV-01JC@4P)+Xr*;oV2oovvnCMUa)?wbr6l z=Id@|jCFCCx5zyPwuu4C!Cbi1sT{w5uD(-k@_UHZB6O^wj&8%AFjVWBYU*Q`ne()n zmlBt_jzy8~gnu~gZSwwmy`f&!2?Q|C;wZoc4@#v~8yBC(^RO=i+~SmhDP5u!$LDax0k z-OR$4MOeCDr~v43F=^Te$|>?CkN^d`4PrtvdmRs|mK%X|2FQ{_IE;MkCyb(hp#q?N zmqwCCsiRdCFgis8Ql1k6QHgO4b=af%!Q%BmF$23s!rI`6ysdkOD_t-a@ZiO;zREQl z4W!lFM<6*4{F+7qHd<9NL4WZy9J~=|Rrr=M@0V7rrDu6>j%GOIfwd!jU$h znzCm#k|0M3BE;yRio{|b^Mmnm0sfl;A}bprE*aoOJbX8lwPGWwJEyySO&!}+REH&) zB?r^FEPlLMhB+B~spP~PGL#wW-KJ5NNNJIthmA+cMB)8Fzjl7g>zsSk+dVSHF uY&C>|5crS}?lecaJbold +bold +``` + +_italic_ +``` +_italic_ +[i]italic[/i] +italic +italic +``` + +underlined +``` ++underlined+ +[u]underlined[/u] +underlined +underlined +``` + +~~strikethrough~~ +``` +-strikethrough- +[s]strikethrough[/s] +strinkethough +strikethrough +``` + +Textile can be escaped like so: + +``` +==-strikethrough-== +``` + +This plugin is compatible with colors-xhtml. + + + +## Usage +Include the JavaScript file: + +```HTML + +``` + +Call its `init()` method after Candy has been initialized: + +```javascript +Candy.init('/http-bind/', {}); + +// enable basic textile/BBCode/Html handling +CandyShop.Emphasis.init(); + +Candy.Core.connect(); +``` + +Optionally, different formats can be disabled. + + +```javascript +CandyShop.Emphasis.init({ textile: false, bbcode: true, html: true }); +``` + +Or just + +```javascript +CandyShop.Emphasis.init({ textile: false }); +``` diff --git a/candy-plugins/emphasis/candy.js b/candy-plugins/emphasis/candy.js new file mode 100644 index 0000000..dcaa80e --- /dev/null +++ b/candy-plugins/emphasis/candy.js @@ -0,0 +1,86 @@ +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +CandyShop.Emphasis = (function(self, Candy, $) { + + // textile, bbcode, old html, escaped old html, new html, escaped new html + var _styles = { + textile: [ + { plain: '==*bold*==', regex: /((^|\s|\>)==\*(.*?)\*==(\s|\<|$))/gm, plain: "$2*$3*$4", xhtml: "$2*$3*$4" }, + { plain: '==_italic_==', regex: /((^|\s|\>)==\_(.*?)\_==(\s|\<|$))/gm, plain: "$2_$3_$4", xhtml: "$2_$3_$4" }, + { plain: '==-strikethrough-==', regex: /((^|\s|\>)==\-(.*?)\-==(\s|\<|$))/gm, plain: "$2-$3-$4", xhtml: "$2-$3-$4" }, + { plain: '==+underline+==', regex: /((^|\s|\>)==\+(.*?)\+==(\s|\<|$))/gm, plain: "$2+$3+$4", xhtml: "$2+$3+$4" }, + { plain: '*bold*', regex: /((^|\s|\>)\*(.*?)\*(\s|\<|$))/gm, plain: "$2*$3*$4", xhtml: "$2$3$4" }, + { plain: '_italic_', regex: /((^|\s|\>)\_(.*?)\_(\s|\<|$))/gm, plain: "$2_$3_$4", xhtml: "$2$3$4" }, + { plain: '-strikethrough-', regex: /((^|\s|\>)\-(.*?)\-(\s|\<|$))/gm, plain: "$2-$3-$4", xhtml: "$2$3$4" }, + { plain: '+underline+', regex: /((^|\s|\>)\+(.*?)\+(\s|\<|$))/gm, plain: "$2+$3+$4", xhtml: "$2$3$4" } + ], + bbcode: [ + { plain: '[b]bold[/b]', regex: /(\[b\](.*?)\[\/b\])/igm, plain: "*$2*", xhtml: "$2" }, + { plain: '[i]italic[/i]', regex: /(\[i\](.*?)\[\/i\])/igm, plain: "_$2_", xhtml: "$2" }, + { plain: '[s]strikethrough[/s]', regex: /(\[s\](.*?)\[\/s\])/igm, plain: "-$2-", xhtml: "$2" }, + { plain: '[u]underline[/u]', regex: /(\[u\](.*?)\[\/u\])/igm, plain: "+$2+", xhtml: "$2" } + ], + html: [ + //handling both escaped an unescaped, just in case. + { plain: '<b>bold</b>', regex: /(\<b\>(.*?)\<\/b\>)/igm, plain: "*$2*", xhtml: "$2" }, + { plain: '<strong>bold</strong>', regex: /(\<strong\>(.*?)\<\/strong\>)/igm, plain: "*$2*", xhtml: "$2" }, + { plain: '<i>italic</i>', regex: /(\<i\>(.*?)\<\/i\>)/igm, plain: "_$2_", xhtml: "$2" }, + { plain: '<em>italic</em>', regex: /(\<em\>(.*?)\<\/em\>)/igm, plain: "_$2_", xhtml: "$2" }, + { plain: '<s>strikethrough</s>', regex: /(\<s\>(.*?)\<\/s\>)/igm, plain: "-$2-", xhtml: "$2" }, + { plain: '<del>strikethrough</del>', regex: /(\<del\>(.*?)\<\/del\>)/igm, plain: "-$2-", xhtml: "$2" }, + { plain: '<u>underline</u>', regex: /(\<u\>(.*?)\<\/u\>)/igm, plain: "+$2+", xhtml: "$2" }, + { plain: '<ins>underline</ins>', regex: /(\<ins\>(.*?)\<\/ins\>)/igm, plain: "+$2+", xhtml: "$2" }, + { plain: 'bold', regex: /(\(.*?)\<\/b\>)/igm, plain: "*$2*", xhtml: "$2" }, + { plain: 'bold', regex: /(\(.*?)\<\/strong\>)/igm, plain: "*$2*", xhtml: "$2" }, + { plain: 'italic', regex: /(\(.*?)\<\/i\>)/igm, plain: "_$2_", xhtml: "$2" }, + { plain: 'italic', regex: /(\(.*?)\<\/em\>)/igm, plain: "_$2_", xhtml: "$2" }, + { plain: 'strikethrough', regex: /(\(.*?)\<\/s\>)/igm, plain: "-$2-", xhtml: "$2" }, + { plain: 'strikethrough', regex: /(\(.*?)\<\/del\>)/igm, plain: "-$2-", xhtml: "$2" }, + { plain: 'underline', regex: /(\(.*?)\<\/u\>)/igm, plain: "+$2+", xhtml: "$2" }, + { plain: 'underline', regex: /(\(.*?)\<\/ins\>)/igm, plain: "+$2+", xhtml: "$2" } + + ] + }; + + var _options = { + textile: true, + bbcode: true, + html: true + }; + + self.init = function( options ) { + // apply the supplied options to the defaults specified + $.extend( true, _options, options ); + + $(Candy).on( 'candy:view.message.before-send', function(e, args) { + var workingPlainMessage = args.message; + var workingXhtmlMessage = args.message; + + if( args.xhtmlMessage ) { + var workingXhtmlMessage = args.xhtmlMessage; + } + + $.each( _options, function( optionIndex, optionValue ){ + if( optionValue === true ){ + $.each( _styles[optionIndex], function( styleIndex, styleValue ){ + workingPlainMessage = workingPlainMessage.replace( styleValue.regex, styleValue.plain ); + workingXhtmlMessage = workingXhtmlMessage.replace( styleValue.regex, styleValue.xhtml ); + }); + } + }); + + if( workingPlainMessage != workingXhtmlMessage) { + // strophe currently requires that xhtml have a root element. Apparently. + // Force one node, with no external text + if( !workingXhtmlMessage.match( /^<.*>$/ ) || $( workingXhtmlMessage ).length != 1 ) { + workingXhtmlMessage = "" + workingXhtmlMessage + ""; + } + args.message = workingPlainMessage; + args.xhtmlMessage = workingXhtmlMessage; + } + }); + + }; + + return self; +}(CandyShop.Emphasis || {}, Candy, jQuery)); diff --git a/candy-plugins/lefttabs/README.md b/candy-plugins/lefttabs/README.md new file mode 100644 index 0000000..1fe116e --- /dev/null +++ b/candy-plugins/lefttabs/README.md @@ -0,0 +1,24 @@ +# Left Tabs + Bootstrap3 Icons + +A plugin for Candy Chat to enable left tabs with simple Bootstrap3 theme elements. + +![Left Tabs + Bootstrap3](screenshot.png) + +## Usage +Include the JavaScript and CSS files: +```HTML + + +``` +Remember to include your Bootstrap3 CSS/JS files! They are not included in this plugin. ;) + +To enable this Left Tabs plugin, add its `init` method _before_ you `init` Candy: +```JavaScript +CandyShop.LeftTabs.init(); +Candy.init('/http-bind', { ... +``` +## Compatibility with other plugins + +Make sure to `init` it after all other plugins, but before the Candy `init`. + +1. CreateRoom diff --git a/candy-plugins/lefttabs/lefttabs.css b/candy-plugins/lefttabs/lefttabs.css new file mode 100644 index 0000000..6641480 --- /dev/null +++ b/candy-plugins/lefttabs/lefttabs.css @@ -0,0 +1,239 @@ +/** + * LeftTabs CSS + * + * @author Melissa Adamaitis + */ + +/* Message pane/body CSS. */ +#chat-rooms { + display: inline-block; + float: right; + margin-left: 50%; + margin-right: 14.6%; + width: 30.5%; +} +.message-pane-wrapper { + float:right; + height: auto; + margin: 0; + position: relative; + width: 100%; +} +.message-pane { + height: 100%; + padding-top: 1px; + width: 69.8%; + overflow-y: scroll; + position: fixed; +} +.message-pane .label { + padding-top: 7px; +} + +/* Input form CSS. */ +.message-form-wrapper { + float: left; + margin-right:auto; + position: relative; + width: 100%; +} +.message-form { + margin: 0; + position: relative; + width: 100%; +} +.message-form input.submit { + margin: 2px 3px; + position: absolute; +} + +/* Roster (right) menu CSS. */ +.roster-pane { + background-color: initial; + border: 0; + box-shadow: none; + float:right; + margin: 0; + padding-right: 3px; + padding-top: 2px; + position: fixed; + right: 0; + width: 14%; +} +.roster-pane .label { + color: #555; + font-size: 0.85em; + line-height: 1em; + padding-left: 0; + text-shadow: none; + width: auto; +} +.roster-pane .user { + border: 0; + box-sizing: initial; + box-shadow: none; + font-size: 14px; + padding: 0; +} +.roster-pane .user ul { + float: right; + margin: 0; + position: relative; +} +.roster-pane .user:hover { + background-color: initial; +} +.roster-pane .user:hover .label { + color: #33bbfc; +} + +/* Toolbar CSS. (Below roster.) */ +#chat-toolbar { + height: 30px; + margin-bottom: 0; + width: 14.5%; +} +#chat-toolbar li { + background-image: none !important; + font-size: 1.25em; + line-height: 1em; +} +#emoticons-icon { + color: #F3E43C; +} +/* Volume. */ +#chat-sound-control, #chat-autoscroll-control { + color: #ccc; +} +#chat-sound-control .glyphicon { + display: none; +} +#chat-sound-control .glyphicon.glyphicon-volume-off { + display: initial; + color: #9b1414; +} +#chat-sound-control.checked .glyphicon.glyphicon-volume-off { + display: none; +} +#chat-sound-control.checked .glyphicon.glyphicon-volume-up { + display: block; +} +/* Scroll */ +#chat-autoscroll-control { + position: relative; +} +#chat-autoscroll-control .glyphicon.glyphicon-ban-circle { + display: initial; + color: #9b1414; + position: absolute; + left: 0; +} +#chat-autoscroll-control.checked .glyphicon.glyphicon-ban-circle { + display: none; +} +/* Status message */ +#chat-statusmessage-control { + position: relative; + color: #6EAEFF; +} +#chat-statusmessage-control .glyphicon.glyphicon-ban-circle { + display: initial; + color: #9b1414; + left: 0; + position: absolute; +} +#chat-statusmessage-control.checked .glyphicon.glyphicon-ban-circle { + display: none; +} +/* Users icon */ +.usercount span.glyphicon { + background-color: initial; +} + +/* Left menu CSS. */ +#left-menu-wrapper { + display: inline-block; + float: left; + position: fixed; + width: 50%; +} +#chat-tabs { + margin: 0; + float: right; + width: 99%; +} +#chat-tabs > li { + margin: 0; + margin-top: 2px; + width: 100% !important; +} +#chat-tabs > li:first-of-type { + margin-top: 0; +} +#chat-tabs a.transition { + display: none; +} +#chat-tabs a.label { + border-radius: 3px 0 0 3px; + text-align: left; + width: 100%; +} +#chat-tabs a.close { + right: -5px; + top: -7px; +} + +/* Extra details (badges, non-specific hovers, background colors, etc...) */ +#chat-tabs small.unread { + border-radius: 50%; + cursor: default; + height: 17px; + padding: 0; + top: 3px; + text-align: center; + width: 17px; +} +.label[href]:hover, .label[href]:focus { + color: #858585; +} +#chat-pane, #roster-pane { + background: #b0e1f2; /* Old browsers */ + background: -moz-linear-gradient(top, #b0e1f2 26%, #81bfe2 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(26%,#b0e1f2), color-stop(100%,#81bfe2)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #b0e1f2 26%,#81bfe2 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #b0e1f2 26%,#81bfe2 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #b0e1f2 26%,#81bfe2 100%); /* IE10+ */ + background: linear-gradient(to bottom, #b0e1f2 26%,#81bfe2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b0e1f2', endColorstr='#81bfe2',GradientType=0 ); /* IE6-9 */ +} + +/* Compatibility with CreateRoom plugin. */ +#create-group { + background: #eee; + border-radius: 3px 0 0 3px; + cursor: pointer !important; + float: right; + height: 18px !important; + margin-right: 1px; + margin-top: 9px; + position: initial; + width: 99%; +} + +#create-group .click { + font-size: 75%; + font-weight: 700; + line-height: 1; + vertical-align: baseline; + position: initial; + text-align: left; +} + +.row { + margin: 0 !important; +} + +/* Align tooltip context menu properly in the roster. */ +#context-menu { + margin-top: 48px !important; +} diff --git a/candy-plugins/lefttabs/lefttabs.js b/candy-plugins/lefttabs/lefttabs.js new file mode 100644 index 0000000..f2d68d8 --- /dev/null +++ b/candy-plugins/lefttabs/lefttabs.js @@ -0,0 +1,104 @@ +/** File: lefttabs.js + * Candy Plugin Left Tabs + Bootstrap3 Layout + * Author: Melissa Adamaitis + */ + +/* global window, Candy, jQuery */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +CandyShop.LeftTabs = (function(self, Candy, $) { + /** + * Initializes the LeftTabs plugin with the default settings. + */ + self.init = function(){ + Candy.View.Template.Chat = { + pane: '
    {{> tabs}}{{> toolbar}}{{> rooms}}
    {{> modal}}', + rooms: '
    ', + tabs: '
    ', + tab: '
  • ' + + '{{#privateUserChat}} {{/privateUserChat}}{{name}}' + + '\u00D7' + + '
  • ', + modal: '
    \u00D7' + + '' + + '' + + '
    ', + adminMessage: '
  • {{time}}
    ' + + '{{sender}}' + + '{{subject}} {{message}}
  • ', + infoMessage: '
  • {{time}}
    ' + + '{{subject}} {{message}}
  • ', + toolbar: '
      ' + + '
    • ' + + '
    • {{> soundcontrol}}
    • ' + + '
    • ' + + '
    • ' + + '
    • ' + + '
    • ' + + '
    ', + soundcontrol: '' + + '', + Context: { + menu: '
    ' + + '
      ', + menulinks: '
    • {{label}}
    • ', + contextModalForm: '
      ' + + '' + + '' + + '
      ', + adminMessageReason: '×' + + '

      {{_action}}

      {{#reason}}

      {{_reason}}

      {{/reason}}' + }, + tooltip: '
      ' + + '
      ' + }; + + // Make the message pane the full height of the window. + self.heights(); + + // Make sure that the window heights are the right size after the window is resized. + $(window).resize(function() { + self.heights(); + }); + + // Make sure that the window heights are the right size after a new room is added. + $(Candy).on('candy:view.room.after-add', function() { + self.heights(); + if(typeof CandyShop.CreateRoom === "object") { + self.createRoomPluginCompatibility(); + } + }); + + $(Candy).on('candy:view.message.after-show', function(ev, obj) { + if(Candy.View.Pane.Window.autoscroll) { + $('div[data-roomjid="' + obj.roomJid + '"] .message-pane').scrollTop($('div[data-roomjid="' + obj.roomJid + '"] .message-pane').prop('scrollHeight') + $('div[data-roomjid="' + obj.roomJid + '"] .message-form-wrapper').height()); + } + }); + + }; + + self.heights = function() { + var barless_height = $(window).height() - $('.message-form-wrapper').height(); + var message_pane_height = barless_height; + var message_pane_wrapper_height = (barless_height - parseInt($('.message-pane-wrapper').css('padding-bottom'))); + if(CandyShop.RoomBar) { + message_pane_height = barless_height - parseInt($('.roombar').css('height')); + $('.message-pane').css('margin-top', parseInt($('.roombar').css('height')) + 'px'); + } + $('.message-pane-wrapper').height(message_pane_wrapper_height + 'px'); + $('.message-pane').height(message_pane_height + 'px'); + $('.roster-pane').height(barless_height + 'px'); + }; + + self.createRoomPluginCompatibility = function() { + $('#create-group-form button').addClass('btn'); + $('#create-group-form .close-button').html(''); + }; + + return self; +}(CandyShop.LeftTabs || {}, Candy, jQuery)); diff --git a/candy-plugins/me-does/README.md b/candy-plugins/me-does/README.md new file mode 100644 index 0000000..7128183 --- /dev/null +++ b/candy-plugins/me-does/README.md @@ -0,0 +1,31 @@ +# /me Does + +Format /me messages, implementing XEP-0245 + +## Usage +Include the JavaScript file: + +```HTML + +``` + +Call its `init()` method after Candy has been initialized: + +```javascript +Candy.init('/http-bind/', {}); + +// enable /me handling +CandyShop.MeDoes.init(); + +Candy.Core.connect(); +``` + +Now all messages starting with '/me 'will use infoMessage formatting. + +``` +/me takes screenshot +``` + +![Color Picker](me-does-screenshot.png) + +**Please note**: As `me-does` reroutes message output, it's call to `init()` should happen after the `init()` of most other plugins, including, `inline-images`. diff --git a/candy-plugins/me-does/candy.js b/candy-plugins/me-does/candy.js new file mode 100644 index 0000000..ed8b357 --- /dev/null +++ b/candy-plugins/me-does/candy.js @@ -0,0 +1,47 @@ +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +CandyShop.MeDoes = (function(self, Candy, $) { +// CandyShop.Timeago + + + self.init = function() { + $(Candy).on("candy:view.message.before-show", function(e, args) { + if (args && args.message && args.message.match(/^\/me /i)) { + var message = args.message.match(/^\/([^\s]+)(?:\s+(.*))?$/m)[2]; + self.userInfoMessage(args.roomJid, args.name, message); + return false; + } + }); + + }; + + if(CandyShop.Timeago === undefined) { + Candy.View.Template.Chat.userInfoMessage = '
    • {{time}}
      ' + + ' {{name}} {{{message}}}
    • '; + } + else { + Candy.View.Template.Chat.userInfoMessage = '
    • {{time}}
      ' + + ' {{name}} {{{message}}}
    • '; + } + + //Using logic from real infoMessage function and inserting custom template + self.userInfoMessage = function (roomJid, name, message){ + + if(Candy.View.getCurrent().roomJid) { + var html = Mustache.to_html(Candy.View.Template.Chat.userInfoMessage, { + name: name, + message: message, + time: Candy.Util.localizedTime(new Date().toGMTString()) + }); + Candy.View.Pane.Room.appendToMessagePane(roomJid, html); + if (Candy.View.getCurrent().roomJid === roomJid) { + Candy.View.Pane.Room.scrollToBottom(Candy.View.getCurrent().roomJid); + } + $(Candy).triggerHandler('candy:view.message.after-show', { + 'message' : message + }); + } + }; + + return self; +}(CandyShop.MeDoes || {}, Candy, jQuery)); diff --git a/candy-plugins/modify-role/README.md b/candy-plugins/modify-role/README.md new file mode 100644 index 0000000..daaa3d8 --- /dev/null +++ b/candy-plugins/modify-role/README.md @@ -0,0 +1,29 @@ +# Modify role +Adds **add moderator** and **remove moderator** privilege links to context menu. + +![Modify role screenshot](screenshot.png) + +## Usage +To enable *Modify role* you have to include its JavaScript code and stylesheet: + +```HTML + + +``` + +Call its `init()` method after Candy has been initialized: + +```JavaScript +Candy.init('/http-bind/'); + +// enable ModifyRole plugin +CandyShop.ModifyRole.init(); + +Candy.Core.connect(); +``` + +## Credits +Thanks to [famfamfam silk icons](http://www.famfamfam.com/lab/icons/silk/) for the icons. + +## License +MIT \ No newline at end of file diff --git a/candy-plugins/modify-role/add-moderator.png b/candy-plugins/modify-role/add-moderator.png new file mode 100644 index 0000000000000000000000000000000000000000..f8153f7fb347566613cce88ae0693e9e2132c787 GIT binary patch literal 3678 zcmZ8j2T&8r)(#M*7o`^^Mv4jqq=+B{LINRz0#YROgkAy&NGMXJ2n6YdA|Sm<(V!qP zbSdH`AWcL-q<1OOk%#x)cjupfXU?9pXTDRuGrKbzqkk94$|S%9003A~+K79nn&Xc! zoITxzw@xsp3g`&C0|Nl6yA;pFE&>2dFlRVi9|ebl^u0VBoZajJ0BzRnXLuvSQJ!cj zMUm2X9t;xQ76@PjeZHm54K#>Bh3eBrMTq$#&S-I+yJ})*)J%hn2HR?KF+UE+jxcU= z=y$XjAT(#k39gLml?q!Ena7>z$ppgcE{!uuv)yI@3R6fs?Yi+s3;yh^;{7$Z%y?f0`G|bBmGHCUqYT@D8uB*T5|b&1rrJ5x{mbgA35EKg;4 zL#sWWY0`+IaT!iYtCd2ltLWi5r~RhU$&0~;$EsZchsGOXE7TkqAqPF_w(?S%!UNb5 zG0VC@YD_Z*)Z)&n&rZG6TL%F)&j4yCo^M@@a>=@SbZk!p9m%W*Q@tmOPxcbnw%+-Ba5 z$OU7Ag;d6f7$1G+&axU^2q3h4y?R zz0V6K`7nqKt)vaBP^g?I-2?~_5vt8W_lyprP3x=?6>?VEOpq1$`e#{_HVLP{g@(+5rsf7r@)l(VAOA z49M1=?+8Ec=k&bIV^g>5d7x}{t-Mo$KLL`F)~zWF>Rk+U{aU6Bf*S~pL{kx(bC+C` zz=gDBnwg1gg@W(mwUZvq(4CFW!=&@^bns6{qX|=36U;F7w#-nvZMumr@7xUs4!N-X z@FMKct722}mukL@H_m0nOSPNWB-ohO5MR-K!K~a8V(V#k4*tYaS` zkVBW-Sf|7`{N7)i;93u7Z}I+#eRQdjDMTpb;$(twN0WFWqZ!aOoc+=>kcgXz5r+W7 zJi~FsxmJ0Duu?rAa1@7sy9M^@tEXRJ?@>ZxcT>1fQ6jweM6PDkh8dw;z?NdFVw6iM z-O6@IFFv%om0p!dF34JxJy}gZ^@Om-ba!P+MUrdUGBHq8FLi{7Ct5>t#jP)e-2PpBR8MQrqTXT{R#0P- zr!`gEsv3#X%*;>2KEY;UW3Z2ZD10yweV-hbTz6itOntHDvuM#J0gZto|IhWccWRZt z+JBX~fK)6z97tLGur0hm*=DpCwKt!=GAlGIFiZM)?`*4#&7Ryn{vtvOflNr)lAn7= zou-c6sCKqGd4Dx+|C;-?M`_?RhcueBgmPVDk0Gw1>~dVW-k^+&m+1BzWGe^-&H4QNV^#?A$+Llz8QUo#u8U^?Tj0K4D9SZ!J?wQ@0vzhbqowZJ8 z%x{2Zvu5*etYp$M);<|Ih?3%z@+zxVOQiath2s^fmA0iMQ^$h4q+U+TWQe&Utj?m& z5U-)9BW)^eU2U+Q2Q|p8%q?s}HkpTfZ0-YnwTXjewUp+?<~3n*Fa=Y#m&=nX`mYt3 z72N8$Y5Vp;>;`n&T&yN08D#m#bSu-cW}Jt7mrUJZ+W{Yn9bTtbjrNPCuX5?OU4DJLZBAVgdWN)%Xt3GLttAAO$#|( zSo*WIh{Yfet;P}DH&TUBfyI*hz?%;uDgRPz#lPOzFW3(cl)`Ev;O%7Xgs#tB$hdeO z9Ui<^H}Zq#5b};@pe9jMhiEE^Ce3IO%m|=jRUTnM?m!V=ud?0G<2upPD?gZ~*C28h z&qym@z23~0^-!x4ty|C!u3Z!qzA(vg62sYAHmh5;ZT${E3mi!yM;|87cSy{~Z&>cx zA0+{a5w9cq5yW=O7+X{oiW@aes|S1Y{o!lt&9IrW)Wp<+t8!)iWq&zG)b7;|XozBB zYa}e?RK+RMZSn;&@P?1hLuvl>4&?Nwzjc3U6GXB^AETK`F0UsXk@mSC z4L+Tl+n&jsaqqd%z14jftl*%4f9Tlg`#b8WMPbdAtuk`B%3|!@UA$#W!_=?FOjsnTVP2)63~ zh3)wf`$JFkTk`TGI_UoX_@|wSRZ7uL(INi3F9ZJD_+rDBX$BT;HQHD8-Li7_(`No= z9r^xBqY1|RfepKJf?YzbZ0T#t?P?d~P{~r^QkXzO<{V`yux>T`Yvq z13mO2m(cr=u3dfCN*L|~=G)ZEHtKTzQbUtth;;~JReK|eii|`Sb+#rv9J)0)qFAb! zdZRTyx#QLJgHDg*@4w)IoE3}uas}`9fHyBGZT#rm6JF0@Q5p4*4Juz0KhE8G+h-PQ zmN)!uIOc8P4d+1Jz{$nXf$R&t7o^m(P9AL&b}}+aA02h5Nxj_9vy^i2!J8T#ksEO_ zywS?{eV`4sGoQ1oYN{rB!id#Y8}Gcz#wdqJ#>5K8DkaNXLD@l+)u`k6;fv&)XVxph z&Wmr>ag;?*(($wD%BPKIg60n_52Yt|8iHn@o@5Ks#hpD^gER)7SbbAn44OFZr!Ql- zQu`Ee^VsRwc4azWoJsFmPPtm;@zCCgLm6dz<;92%mGs0hA*voOeUi3ct=D#jT1J)7 zs?}OTRwAi{eZqLatL+azdkDmV>By$5zu)er^;hHu;}0p0*zWe9uKmjyYPTm!8^z#_67i$IsXU^AoDpN06=5sY-H+VdPi5;)&mE@*m+>>A$~Z|Q#1ge;-`FS z;_Q7eAU~X&ySK8RD)?`N@~QpDEe!_!4e@bR1)JW{2f;nO>_G|;d58=c$^-&|RJ`mQ zlBTWt)$|QW(kOyFzQz*WmK!lHV)1Hny@~V6q7-eeL*lYFalx1D^u~;j zEhQ4^i9~Gy&en1F z7Qvk}z?>AaxMZ0RJ?4}%&d}}9ExITBS5p_YlfT~fs5B&sr}X>g{>^6)3%GT;jtjY= z6w%(-C3k*`i@qE7z*Djv=dl{nKKhPNG9l8`kN;U;XOSGUoofja=rr-9bDGBEZZ`RQ zhA~bU3Tyeb5Co=SCt6{A9ddL=yF(?c27f>BH8JMSEY3&`e)_vYar-g-SfJouL*3J~ zSw+)BPx{v*)YP>nfOyYZv&y$mwq-MPp;%z`9;IeuajYXHa$mx)XMSC literal 0 HcmV?d00001 diff --git a/candy-plugins/modify-role/candy.css b/candy-plugins/modify-role/candy.css new file mode 100644 index 0000000..f6246bc --- /dev/null +++ b/candy-plugins/modify-role/candy.css @@ -0,0 +1,6 @@ +#context-menu .add-moderator { + background-image: url(add-moderator.png); +} +#context-menu .remove-moderator { + background-image: url(remove-moderator.png); +} \ No newline at end of file diff --git a/candy-plugins/modify-role/candy.js b/candy-plugins/modify-role/candy.js new file mode 100644 index 0000000..0996986 --- /dev/null +++ b/candy-plugins/modify-role/candy.js @@ -0,0 +1,97 @@ +/** File: candy.js + * Plugin for modifying roles. Currently implemented: op & deop + * + * Authors: + * - Michael Weibel + * + * License: MIT + * + * Copyright: + * (c) 2014 Michael Weibel. All rights reserved. + */ + +/* global Candy, jQuery, Strophe, $iq */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +/** Class: CandyShop.ModifyRole + * Remove the ignore option in the roster + */ +CandyShop.ModifyRole = (function(self, Candy, $) { + + var modifyRole = function modifyRole(role, roomJid, user) { + var conn = Candy.Core.getConnection(), + nick = user.getNick(), + iq = $iq({ + 'to': Candy.Util.escapeJid(roomJid), + 'type': 'set' + }); + + iq.c('query', {'xmlns': Strophe.NS.MUC_ADMIN}) + .c('item', {'nick': nick, 'role': role}); + + conn.sendIQ(iq.tree()); + }; + + var applyTranslations = function applyTranslations() { + var addModeratorActionLabel = { + 'en' : 'Grant moderator status', + 'de' : 'Moderator status geben' + }; + var removeModeratorActionLabel = { + 'en' : 'Remove moderator status', + 'de' : 'Moderator status nehmen' + }; + + $.each(addModeratorActionLabel, function(k, v) { + if(Candy.View.Translation[k]) { + Candy.View.Translation[k].addModeratorActionLabel = v; + } + }); + $.each(removeModeratorActionLabel, function(k, v) { + if(Candy.View.Translation[k]) { + Candy.View.Translation[k].removeModeratorActionLabel = v; + } + }); + }; + + var isOwnerOrAdmin = function(user) { + return ['owner', 'admin'].indexOf(user.getAffiliation()) !== -1; + }; + var isModerator = function(user) { + return user.getRole() === 'moderator'; + }; + + /** Function: init + * Initializes the plugin by adding an event which modifies + * the contextmenu links. + */ + self.init = function init() { + applyTranslations(); + + $(Candy).bind('candy:view.roster.context-menu', function(e, args) { + args.menulinks.addModerator = { + requiredPermission: function(user, me) { + return me.getNick() !== user.getNick() && isOwnerOrAdmin(me) && !isOwnerOrAdmin(user) && !isModerator(user); + }, + 'class' : 'add-moderator', + 'label' : $.i18n._('addModeratorActionLabel'), + 'callback' : function(e, roomJid, user) { + modifyRole('moderator', roomJid, user); + } + }; + args.menulinks.removeModerator = { + requiredPermission: function(user, me) { + return me.getNick() !== user.getNick() && isOwnerOrAdmin(me) && !isOwnerOrAdmin(user) && isModerator(user); + }, + 'class' : 'remove-moderator', + 'label' : $.i18n._('removeModeratorActionLabel'), + 'callback' : function(e, roomJid, user) { + modifyRole('participant', roomJid, user); + } + }; + }); + }; + + return self; +}(CandyShop.ModifyRole || {}, Candy, jQuery)); diff --git a/candy-plugins/modify-role/remove-moderator.png b/candy-plugins/modify-role/remove-moderator.png new file mode 100644 index 0000000000000000000000000000000000000000..e694a77e72236af5595f629ef1fab3ed9c510fa8 GIT binary patch literal 3672 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 literal 0 HcmV?d00001 diff --git a/candy-plugins/namecomplete/README.md b/candy-plugins/namecomplete/README.md new file mode 100644 index 0000000..011a4c9 --- /dev/null +++ b/candy-plugins/namecomplete/README.md @@ -0,0 +1,31 @@ +# Name completion plugin +This plugin will complete the names of users in the room when a specified key is pressed. + +### Usage + + + + ... + + CandyShop.NameComplete.init(); + +### Configuration options +`nameIdentifier` - String - The identifier to look for in a string. Defaults to `'@'` + +`completeKeyCode` - Integer - The key code of the key to use. Defaults to `9` (tab) + +### Example configurations + + // complete the name when the user types +nick and hits the right arrow + // +troymcc -> +troymccabe + CandyShop.NameComplete.init({ + nameIdentifier: '+', + completeKeyCode: '39' + }); + + // complete the name when the user types -nick and hits the up arrow + // +troymcc ^ +troymccabe + CandyShop.NameComplete.init({ + nameIdentifier: '-', + completeKeyCode: '38' + }); \ No newline at end of file diff --git a/candy-plugins/namecomplete/candy.css b/candy-plugins/namecomplete/candy.css new file mode 100644 index 0000000..0102f31 --- /dev/null +++ b/candy-plugins/namecomplete/candy.css @@ -0,0 +1,7 @@ +#context-menu li.selected { + background-color: #ccc; +} + +#context-menu li.candy-namecomplete-option { + padding: 3px 5px; +} \ No newline at end of file diff --git a/candy-plugins/namecomplete/candy.js b/candy-plugins/namecomplete/candy.js new file mode 100644 index 0000000..7467fd5 --- /dev/null +++ b/candy-plugins/namecomplete/candy.js @@ -0,0 +1,260 @@ +/** File: candy.js + * Candy - Chats are not dead yet. + * + * Authors: + * - Troy McCabe + * - Ben Klang + * + * Copyright: + * (c) 2012 Geek Squad. All rights reserved. + * (c) 2014 Power Home Remodeling Group. All rights reserved. + */ + +/* global document, Candy, jQuery */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +/** Class: CandyShop.NameComplete + * Allows for completion of a name in the roster + */ +CandyShop.NameComplete = (function(self, Candy, $) { + /** Object: _options + * Options: + * (String) nameIdentifier - Prefix to append to a name to look for. '@' now looks for '@NICK', '' looks for 'NICK', etc. Defaults to '@' + * (Integer) completeKeyCode - Which key to use to complete + */ + var _options = { + nameIdentifier: '@', + completeKeyCode: 9 + }; + + /** Array: _nicks + * An array of nicks to complete from + * Populated after 'candy:core.presence' + */ + var _nicks = []; + + /** String: _selector + * The selector for the visible message box + */ + var _selector = 'input[name="message"]:visible'; + + /** Boolean:_autocompleteStarted + * Keeps track of whether we're in the middle of autocompleting a name + */ + var _autocompleteStarted = false; + + /** Function: init + * Initialize the NameComplete plugin + * Show options for auto completion of names + * + * Parameters: + * (Object) options - Options to apply to this plugin + */ + self.init = function(options) { + // apply the supplied options to the defaults specified + $.extend(true, _options, options); + + // listen for keydown when autocomplete options exist + $(document).on('keypress', _selector, function(e) { + if (e.which === _options.nameIdentifier.charCodeAt()) { + _autocompleteStarted = true; + } + + if (_autocompleteStarted) { + // update the list of nicks to grab + self.populateNicks(); + + // set up the vars for this method + // break it on spaces, and get the last word in the string + var field = $(this); + var msgParts = field.val().split(' '); + var lastWord = new RegExp( "^" + msgParts[msgParts.length - 1] + String.fromCharCode(e.which), "i"); + var matches = []; + + // go through each of the nicks and compare it + $(_nicks).each(function(index, item) { + // if we have results + if (item.match(lastWord) !== null) { + matches.push(item); + } + + }); + + // if we only have one match, no need to show the picker, just replace it + // else show the picker of the name matches + if (matches.length === 1) { + self.replaceName(matches[0]); + // Since the name will be autocompleted, throw away the last character + e.preventDefault(); + } else if (matches.length > 1) { + self.showPicker(matches, field); + } + } + }); + }; + + /** Function: keyDown + * The listener for keydown in the menu + */ + self.keyDown = function(e) { + // get the menu and the content element + var menu = $('#context-menu'); + var content = menu.find('ul'); + var selected = content.find('li.selected'); + + if(menu.css('display') === 'none') { + $(document).unbind('keydown', self.keyDown); + return; + } + + // switch the key code + switch (e.which) { + // up arrow + case 38: + // down arrow + case 40: + var newEl; + if (e.which === 38) { + // move the selected thing up + newEl = selected.prev(); + } else { + // move the selected thing down + newEl = selected.next(); + } + // Prevent going off either end of the list + if ($(newEl).length > 0) { + selected.removeClass('selected'); + newEl.addClass('selected'); + } + // don't perform any key actions + e.preventDefault(); + break; + + // esc key + case 27: + // delete Key + case 8: + case 46: + self.endAutocomplete(); + break; + + // the key code for completion + case _options.completeKeyCode: + case 13: + // get the text of the selected item + var val = content.find('li.selected').text(); + // replace the last item with the selected item + self.replaceName(val); + // don't perform any key actions + e.preventDefault(); + break; + } + }; + + /** Function: endAutocomplete + * Disables autocomplete mode, hiding the context menu + */ + self.endAutocomplete = function() { + _autocompleteStarted = false; + $(_selector).unbind('keydown', self.keyDown); + $('#context-menu').hide(); + }; + + + + /** Function: selectOnClick + * The listener for click on decision in the menu + * + * Parameters: + * (Event) e - The click event + */ + self.selectOnClick = function(e) { + self.replaceName($(e.currentTarget).text()); + $(_selector).focus(); + e.preventDefault(); + }; + + /** Function: populateNicks + * Populate the collection of nicks to autocomplete from + */ + self.populateNicks = function() { + // clear the nick collection + _nicks = []; + + // grab the roster in the current room + var room = Candy.Core.getRoom(Candy.View.getCurrent().roomJid); + if (room !== null) { + var roster = room.getRoster().getAll(); + + // iterate and add the nicks to the collection + $.each(roster, function(index, item) { + _nicks.push(_options.nameIdentifier + item.getNick()); + }); + } + }; + + /** Function: replaceName + * + */ + self.replaceName = function(replaceText) { + // get the parts of the message + var $msgBox = $(_selector); + var msgParts = $msgBox.val().split(' '); + + // If the name is the first word, add a colon to the end + if (msgParts.length === 1) { + replaceText += ": "; + } else { + replaceText += " "; + } + + // replace the last part with the item + msgParts[msgParts.length - 1] = replaceText; + + // put the string back together on spaces + $msgBox.val(msgParts.join(' ')); + self.endAutocomplete(); + }; + + /** Function: showPicker + * Show the picker for the list of names that match + */ + self.showPicker = function(matches, elem) { + // get the element + elem = $(elem); + + // get the necessary items + var pos = elem.offset(), + menu = $('#context-menu'), + content = $('ul', menu), + i; + + // clear the content if needed + content.empty(); + + // add the matches to the list + for(i = 0; i < matches.length; i++) { + content.append('
    • ' + matches[i] + '
    • '); + } + + // select the first item + $(content.find('li')[0]).addClass('selected'); + + content.find('li').click(self.selectOnClick); + + // bind the keydown to move around the menu + $(_selector).bind('keydown', self.keyDown); + + var posLeft = elem.val().length * 7, + posTop = Candy.Util.getPosTopAccordingToWindowBounds(menu, pos.top); + + // show it + menu.css({'left': posLeft, 'top': posTop.px, backgroundPosition: posLeft.backgroundPositionAlignment + ' ' + posTop.backgroundPositionAlignment}); + menu.fadeIn('fast'); + + return true; + }; + + return self; +}(CandyShop.NameComplete || {}, Candy, jQuery)); diff --git a/candy-plugins/nickchange/README.md b/candy-plugins/nickchange/README.md new file mode 100644 index 0000000..92acf15 --- /dev/null +++ b/candy-plugins/nickchange/README.md @@ -0,0 +1,26 @@ +# Nickchange +Enable your users to change the nick using a toolbar icon. + +![Nickchange Icon](screenshot.png) + +## Usage +To enable *Nickchange* you have to include its JavaScript code and stylesheet: + +```HTML + + +``` + +Call its `init()` method after Candy has been initialized: + +```JavaScript +Candy.init('/http-bind/'); + +// enable Nickchange plugin +CandyShop.Nickchange.init(); + +Candy.Core.connect(); +``` + +## Credits +Thanks to [famfamfam silk icons](http://www.famfamfam.com/lab/icons/silk/) for the rename icon. \ No newline at end of file diff --git a/candy-plugins/nickchange/candy.css b/candy-plugins/nickchange/candy.css new file mode 100644 index 0000000..8cf7d7d --- /dev/null +++ b/candy-plugins/nickchange/candy.css @@ -0,0 +1,3 @@ +#nickchange-control { + background: no-repeat url('nickchange-control.png'); +} \ No newline at end of file diff --git a/candy-plugins/nickchange/candy.js b/candy-plugins/nickchange/candy.js new file mode 100644 index 0000000..3294070 --- /dev/null +++ b/candy-plugins/nickchange/candy.js @@ -0,0 +1,63 @@ +/** + * Nickchange plugin for Candy + * + * Copyright 2014 Michael Weibel + * + * License: MIT + */ + +/* global Candy, jQuery, Mustache */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +CandyShop.Nickchange = (function(self, Candy, $) { + + self.init = function() { + self.applyTranslations(); + + var html = '
    • '; + $('#emoticons-icon').after(html); + $('#nickchange-control').click(function() { + self.showModal(); + }); + }; + + self.showModal = function() { + Candy.View.Pane.Chat.Modal.show(Mustache.to_html(self.nicknameChangeForm, { + _labelNickname: $.i18n._('labelNickname'), + _label: $.i18n._('candyshopNickchange') + })); + $('#nickname').focus(); + + // register submit handler + $('#nickname-change-form').submit(self.changeNickname); + }; + + self.changeNickname = function() { + var nickname = $('#nickname').val(); + Candy.View.Pane.Chat.Modal.hide(function() { + Candy.Core.Action.Jabber.SetNickname(nickname); + }); + return false; + }; + + self.nicknameChangeForm = '{{_label}}' + + '
      ' + + '' + + '
      '; + + self.applyTranslations = function() { + var translations = { + 'en' : 'Change nickname', + 'de' : 'Spitzname ändern' + }; + $.each(translations, function(k, v) { + if(Candy.View.Translation[k]) { + Candy.View.Translation[k].candyshopNickchange = v; + } + + }); + }; + + return self; +}(CandyShop.Nickchange || {}, Candy, jQuery)); diff --git a/candy-plugins/nickchange/nickchange-control.png b/candy-plugins/nickchange/nickchange-control.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3688edc88c10d2f0e31198d0b17303bc1d223b GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i?8!V{ znjV^ye=2;qm;P{$`s;H$`x~a}R(xgP|G$RoO>~FD8I7fnS&nXWFMPEjPiNb7^=IwB zO%ASl$t*T|^U-%%8&{}vv|YWQef;Fc%Euzc)I$ztaD0e0suWxYs>%u literal 0 HcmV?d00001 diff --git a/candy-plugins/notifications/README.md b/candy-plugins/notifications/README.md new file mode 100644 index 0000000..5fc2f3f --- /dev/null +++ b/candy-plugins/notifications/README.md @@ -0,0 +1,29 @@ +# Notifications +Send HTML5 Notifications when a message is received and the window is not in focus. This only works with webkit browsers. + +## Usage +To enable *Notifications* you have to include its JavaScript code and stylesheet: + +```HTML + +``` + +Call its `init()` method after Candy has been initialized: + +```JavaScript +Candy.init('/http-bind/'); + +CandyShop.Notifications.init(); + +Candy.Core.connect(); +``` + +It is possible to configure the Plugin. + +```JavaScript +CandyShop.Notifications.init({ + notifyNormalMessage: false, // Send a notification for every message. Defaults to false + notifyPersonalMessage: true, // Send a notification if the user is mentioned. (Requires NotfiyMe Plugin) Defaults to true + closeTime: 3000 // Close notification after X milliseconds. Zero means it doesn't close automaticly. Defaults to 3000 +}); +``` \ No newline at end of file diff --git a/candy-plugins/notifications/candy.js b/candy-plugins/notifications/candy.js new file mode 100644 index 0000000..0aec881 --- /dev/null +++ b/candy-plugins/notifications/candy.js @@ -0,0 +1,111 @@ +/* + * HTML5 Notifications + * @version 1.0 + * @author Jonatan Männchen + * @author Melissa Adamaitis + * + * Notify user if new messages come in. + */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +CandyShop.Notifications = (function(self, Candy, $) { + /** Object: _options + * Options for this plugin's operation + * + * Options: + * (Boolean) notifyNormalMessage - Notification on normalmessage. Defaults to false + * (Boolean) notifyPersonalMessage - Notification for private messages. Defaults to true + * (Boolean) notifyMention - Notification for mentions. Defaults to true + * (Integer) closeTime - Time until closing the Notification. (0 = Don't close) Defaults to 3000 + * (String) title - Title to be used in notification popup. Set to null to use the contact's name. + * (String) icon - Path to use for image/icon for notification popup. + */ + var _options = { + notifyNormalMessage: false, + notifyPersonalMessage: true, + notifyMention: true, + closeTime: 3000, + title: null, + icon: window.location.origin + '/' + Candy.View.getOptions().assets + '/img/favicon.png' + }; + + /** Function: init + * Initializes the notifications plugin. + * + * Parameters: + * (Object) options - The options to apply to this plugin + * + * @return void + */ + self.init = function(options) { + // apply the supplied options to the defaults specified + $.extend(true, _options, options); + + // Just init if notifications are supported + if (window.Notification) { + // Setup Permissions (has to be kicked on with some user-events) + jQuery(document).one('click keydown', self.setupPermissions); + + // Add Listener for Notifications + $(Candy).on('candy:view.message.notify', self.handleNotification); + } + }; + + /** Function: checkPermissions + * Check if the plugin has permission to send notifications. + * + * @return boid + */ + self.setupPermissions = function() { + // Check if permissions is given + if (window.Notification !== 0) { // 0 is PERMISSION_ALLOWED + // Request for it + window.Notification.requestPermission(); + } + }; + + /** Function: handleNotification + * Descriptions + * + * Parameters: + * (Array) args + * + * @return void + */ + self.handleNotification = function(e, args) { + // Check if window has focus, so no notification needed + if (!document.hasFocus()) { + if(_options.notifyNormalMessage || + (self.mentionsMe(args.message) && _options.notifyMention) || + (_options.notifyPersonalMessage && Candy.View.Pane.Chat.rooms[args.roomJid].type === 'chat')) { + // Create the notification. + var title = !_options.title ? args.name : _options.title , + notification = new window.Notification(title, { + icon: _options.icon, + body: args.message + }); + + // Close it after 3 Seconds + if(_options.closeTime) { + window.setTimeout(function() { notification.close(); }, _options.closeTime); + } + } + } + }; + + self.mentionsMe = function(message) { + var message = message.toLowerCase(), + nick = Candy.Core.getUser().getNick().toLowerCase(), + cid = Strophe.getNodeFromJid(Candy.Core.getUser().getJid()).toLowerCase(), + jid = Candy.Core.getUser().getJid().toLowerCase(); + if (message.indexOf(nick) === -1 && + message.indexOf(cid) === -1 && + message.indexOf(jid) === -1) { + return false; + } + return true; + }; + + return self; +}(CandyShop.Notifications || {}, Candy, jQuery)); diff --git a/candy-plugins/replies/README.md b/candy-plugins/replies/README.md new file mode 100644 index 0000000..68401d1 --- /dev/null +++ b/candy-plugins/replies/README.md @@ -0,0 +1,29 @@ +# Reply Highlighting + +To better support conversations in high-activity rooms, this plugin highlights any message that contains "@yourusername" by default. + +## Usage + +```HTML + + +``` + +```JavaScript +CandyShop.Replies.init(); +``` + + +```Options +boolean - default true - require @ if true +prefix - strip a prefix while searching +suffix - strip a suffix while searching +``` + +Prefix & suffix assume generated user names for an anonymous user. For example, say your generated nick is _user533_ , and they change their nickname to _jimbob_. With the options: + +```JavaScript +CandyShop.Replies.init(false,'user',''); +``` + +This would highlight lines with _user533_, _533_, and _jimbob_ in them. diff --git a/candy-plugins/replies/candy.css b/candy-plugins/replies/candy.css new file mode 100644 index 0000000..0eb0bec --- /dev/null +++ b/candy-plugins/replies/candy.css @@ -0,0 +1,4 @@ +.message-pane li.mention, +.message-pane li.mention small { + background-color: #FFF7DE; +} \ No newline at end of file diff --git a/candy-plugins/replies/candy.js b/candy-plugins/replies/candy.js new file mode 100644 index 0000000..fc8b0fb --- /dev/null +++ b/candy-plugins/replies/candy.js @@ -0,0 +1,50 @@ +/* + * candy-replies-plugin + * @version 0.4 (2015-02-05) + * @author Drew Harry (drew.harry@gmail.com) + * Contributors: + * - Sudrien <_+github@sudrien.net> + * + * Adds @reply highlighting to chat messages to help with high velocity + * conversations. + */ + +/* global Candy, jQuery */ + +var CandyShop = (function(self) { return self; }(CandyShop || {})); + +CandyShop.Replies = (function(self, Candy, $) { + + var requireAt = true, + prefix = '', + suffix = ''; + + self.init = function( requireAtValue, prefixValue, suffixValue ) { + requireAt = typeof requireAtValue !== 'undefined' ? requireAtValue : true; + prefix = prefixValue !== undefined ? prefixValue : ''; + suffix = suffixValue !== undefined ? suffixValue : ''; + + $(Candy).on('candy:view.message.after-show', handleOnShow); + return self; + }; + + var handleOnShow = function(e, args) { + var possibleNicks = $('.me').map(function(){ return $(this).attr('data-nick'); }); + possibleNicks.push(Candy.Core.getUser().getNick()); + + $.unique(possibleNicks).each(function(key,nick) { + if( RegExp("(\\W|^)" + ( requireAt ? '@' : '' ) + nick + "(\\W|$)" , "im").test(args.message) ) { + $(args.element).addClass("mention"); + } + if( prefix !== '' || suffix !== '') { + var shortNick = nick.replace( RegExp("^" + prefix), "").replace( RegExp( suffix + "$"), ""); + if( RegExp("(\\W|^)" + ( requireAt ? '@' : '' ) + shortNick + "(\\W|$)" , "im").test(args.message) ) { + $(args.element).addClass("mention"); + } + } + }); + } + + return self; + +}(CandyShop.Replies || {}, Candy, jQuery)); diff --git a/candy.min.js b/candy.min.js new file mode 100644 index 0000000..474fc85 --- /dev/null +++ b/candy.min.js @@ -0,0 +1,4 @@ +"use strict";var Candy=function(a,b){return a.about={name:"Candy",version:"1.7.1"},a.init=function(c,d){d.viewClass||(d.viewClass=a.View),d.viewClass.init(b("#candy"),d.view),a.Core.init(c,d.core)},a}(Candy||{},jQuery);Candy.Core=function(a,b,c){var d,e=null,f=null,g=null,h={},i=!1,j={autojoin:void 0,debug:!1,disableWindowUnload:!1,presencePriority:1,resource:Candy.about.name},k=function(a,c){b.addNamespace(a,c)},l=function(){k("PRIVATE","jabber:iq:private"),k("BOOKMARKS","storage:bookmarks"),k("PRIVACY","jabber:iq:privacy"),k("DELAY","jabber:x:delay"),k("PUBSUB","http://jabber.org/protocol/pubsub")},m=function(a){var c=b.getNodeFromJid(a),d=b.getDomainFromJid(a);return c?b.escapeNode(c)+"@"+d:d};return a.init=function(d,g){f=d,c.extend(!0,j,g),j.debug&&(void 0!==typeof window.console&&void 0!==typeof window.console.log&&(a.log=Function.prototype.bind&&Candy.Util.getIeVersion()>8?Function.prototype.bind.call(console.log,console):function(){Function.prototype.apply.call(console.log,console,arguments)}),a.log("[Init] Debugging enabled")),l(),e=new b.Connection(f),e.rawInput=a.rawInput.bind(a),e.rawOutput=a.rawOutput.bind(a),e.caps.node="https://candy-chat.github.io/candy/",j.disableWindowUnload||(window.onbeforeunload=a.onWindowUnload)},a.registerEventHandlers=function(){a.addHandler(a.Event.Jabber.Version,b.NS.VERSION,"iq"),a.addHandler(a.Event.Jabber.Presence,null,"presence"),a.addHandler(a.Event.Jabber.Message,null,"message"),a.addHandler(a.Event.Jabber.Bookmarks,b.NS.PRIVATE,"iq"),a.addHandler(a.Event.Jabber.Room.Disco,b.NS.DISCO_INFO,"iq","result"),a.addHandler(e.disco._onDiscoInfo.bind(e.disco),b.NS.DISCO_INFO,"iq","get"),a.addHandler(e.disco._onDiscoItems.bind(e.disco),b.NS.DISCO_ITEMS,"iq","get"),a.addHandler(e.caps._delegateCapabilities.bind(e.caps),b.NS.CAPS)},a.connect=function(d,f,h){e.reset(),a.registerEventHandlers(),c(Candy).triggerHandler("candy:core.before-connect",{connection:e}),i=i?!0:d&&d.indexOf("@")<0,d&&f?(e.connect(m(d)+"/"+j.resource,f,Candy.Core.Event.Strophe.Connect),g=h?new a.ChatUser(d,h):new a.ChatUser(d,b.getNodeFromJid(d))):d&&h?(e.connect(m(d)+"/"+j.resource,null,Candy.Core.Event.Strophe.Connect),g=new a.ChatUser(null,h)):d?Candy.Core.Event.Login(d):Candy.Core.Event.Login()},a.attach=function(c,d,f){g=new a.ChatUser(c,b.getNodeFromJid(c)),a.registerEventHandlers(),e.attach(c,d,f,Candy.Core.Event.Strophe.Connect)},a.disconnect=function(){e.connected&&(c.each(a.getRooms(),function(){Candy.Core.Action.Jabber.Room.Leave(this.getJid())}),e.disconnect())},a.addHandler=function(a,b,c,d,f,g,h){return e.addHandler(a,b,c,d,f,g,h)},a.getUser=function(){return g},a.setUser=function(a){g=a},a.getConnection=function(){return e},a.removeRoom=function(a){delete h[a]},a.getRooms=function(){return h},a.getStropheStatus=function(){return d},a.setStropheStatus=function(a){d=a},a.isAnonymousConnection=function(){return i},a.getOptions=function(){return j},a.getRoom=function(a){return h[a]?h[a]:null},a.onWindowUnload=function(){e.options.sync=!0,a.disconnect(),e.flush()},a.rawInput=function(a){this.log("RECV: "+a)},a.rawOutput=function(a){this.log("SENT: "+a)},a.log=function(){},a}(Candy.Core||{},Strophe,jQuery),Candy.View=function(a,b){var c={container:null,roomJid:null},d={language:"en",assets:"res/",messages:{limit:2e3,remove:500},crop:{message:{nickname:15,body:1e3},roster:{nickname:15}},enableXHTML:!1},e=function(c){b.i18n.load(a.Translation[c])},f=function(){b(Candy).on("candy:core.chat.connection",a.Observer.Chat.Connection),b(Candy).on("candy:core.chat.message",a.Observer.Chat.Message),b(Candy).on("candy:core.login",a.Observer.Login),b(Candy).on("candy:core.autojoin-missing",a.Observer.AutojoinMissing),b(Candy).on("candy:core.presence",a.Observer.Presence.update),b(Candy).on("candy:core.presence.leave",a.Observer.Presence.update),b(Candy).on("candy:core.presence.room",a.Observer.Presence.update),b(Candy).on("candy:core.presence.error",a.Observer.PresenceError),b(Candy).on("candy:core.message",a.Observer.Message)},g=function(){Candy.Util.getIeVersion()<9?b(document).focusin(Candy.View.Pane.Window.onFocus).focusout(Candy.View.Pane.Window.onBlur):b(window).focus(Candy.View.Pane.Window.onFocus).blur(Candy.View.Pane.Window.onBlur),b(window).resize(Candy.View.Pane.Chat.fitTabs)},h=function(){a.Pane.Chat.Toolbar.init()},i=function(){b("body").delegate("li[data-tooltip]","mouseenter",Candy.View.Pane.Chat.Tooltip.show)};return a.init=function(a,j){j.resources&&(j.assets=j.resources),delete j.resources,b.extend(!0,d,j),e(d.language),Candy.Util.Parser.setEmoticonPath(this.getOptions().assets+"img/emoticons/"),c.container=a,c.container.html(Mustache.to_html(Candy.View.Template.Chat.pane,{tooltipEmoticons:b.i18n._("tooltipEmoticons"),tooltipSound:b.i18n._("tooltipSound"),tooltipAutoscroll:b.i18n._("tooltipAutoscroll"),tooltipStatusmessage:b.i18n._("tooltipStatusmessage"),tooltipAdministration:b.i18n._("tooltipAdministration"),tooltipUsercount:b.i18n._("tooltipUsercount"),assetsPath:this.getOptions().assets},{tabs:Candy.View.Template.Chat.tabs,rooms:Candy.View.Template.Chat.rooms,modal:Candy.View.Template.Chat.modal,toolbar:Candy.View.Template.Chat.toolbar,soundcontrol:Candy.View.Template.Chat.soundcontrol})),g(),h(),f(),i()},a.getCurrent=function(){return c},a.getOptions=function(){return d},a}(Candy.View||{},jQuery),Candy.Util=function(a,b){a.jidToId=function(a){return MD5.hexdigest(a)},a.escapeJid=function(a){var b=Strophe.escapeNode(Strophe.getNodeFromJid(a)),c=Strophe.getDomainFromJid(a),d=Strophe.getResourceFromJid(a);return a=b+"@"+c,d&&(a+="/"+d),a},a.unescapeJid=function(a){var b=Strophe.unescapeNode(Strophe.getNodeFromJid(a)),c=Strophe.getDomainFromJid(a),d=Strophe.getResourceFromJid(a);return a=b+"@"+c,d&&(a+="/"+d),a},a.crop=function(a,b){return a.length>b&&(a=a.substr(0,b-3)+"..."),a},a.parseAndCropXhtml=function(c,d){return b("
      ").append(a.createHtml(b(c).get(0),d)).html()},a.setCookie=function(a,b,c){var d=new Date;d.setDate((new Date).getDate()+c),document.cookie=a+"="+b+";expires="+d.toUTCString()+";path=/"},a.cookieExists=function(a){return document.cookie.indexOf(a)>-1},a.getCookie=function(a){if(document.cookie){var b=new RegExp(escape(a)+"=([^;]*)","gm"),c=b.exec(document.cookie);if(c)return c[1]}},a.deleteCookie=function(a){document.cookie=a+"=;expires=Thu, 01-Jan-70 00:00:01 GMT;path=/"},a.getPosLeftAccordingToWindowBounds=function(a,c){var d=b(document).width(),e=a.outerWidth(),f=e-a.outerWidth(!0),g="left";return c+e>=d&&(c-=e-f,g="right"),{px:c,backgroundPositionAlignment:g}},a.getPosTopAccordingToWindowBounds=function(a,c){var d=b(document).height(),e=a.outerHeight(),f=e-a.outerHeight(!0),g="top";return c+e>=d&&(c-=e-f,g="bottom"),{px:c,backgroundPositionAlignment:g}},a.localizedTime=function(c){if(void 0===c)return void 0;var d=a.iso8601toDate(c);return d.format(d.toDateString()===(new Date).toDateString()?b.i18n._("timeFormat"):b.i18n._("dateFormat"))},a.iso8601toDate=function(a){var b=Date.parse(a);if(isNaN(b)){var c=/^(\d{4}|[+\-]\d{6})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?))?/.exec(a);if(c){var d=0;return"Z"!==c[8]&&(d=60*+c[10]+ +c[11],"+"===c[9]&&(d=-d)),d-=(new Date).getTimezoneOffset(),new Date(+c[1],+c[2]-1,+c[3],+c[4],+c[5]+d,+c[6],c[7]?+c[7].substr(0,3):0)}b=Date.parse(a.replace(/^(\d{4})(\d{2})(\d{2})/,"$1-$2-$3")+"Z")}return new Date(b)},a.isEmptyObject=function(a){var b;for(b in a)if(a.hasOwnProperty(b))return!1;return!0},a.forceRedraw=function(a){a.css({display:"none"}),setTimeout(function(){this.css({display:"block"})}.bind(a),1)};var c=function(){for(var a,b=3,c=document.createElement("div"),d=c.getElementsByTagName("i");c.innerHTML="",d[0];);return b>4?b:a}();return a.getIeVersion=function(){return c},a.Parser={_emoticonPath:"",setEmoticonPath:function(a){this._emoticonPath=a},emoticons:[{plain:":)",regex:/((\s):-?\)|:-?\)(\s|$))/gm,image:"Smiling.png"},{plain:";)",regex:/((\s);-?\)|;-?\)(\s|$))/gm,image:"Winking.png"},{plain:":D",regex:/((\s):-?D|:-?D(\s|$))/gm,image:"Grinning.png"},{plain:";D",regex:/((\s);-?D|;-?D(\s|$))/gm,image:"Grinning_Winking.png"},{plain:":(",regex:/((\s):-?\(|:-?\((\s|$))/gm,image:"Unhappy.png"},{plain:"^^",regex:/((\s)\^\^|\^\^(\s|$))/gm,image:"Happy_3.png"},{plain:":P",regex:/((\s):-?P|:-?P(\s|$))/gim,image:"Tongue_Out.png"},{plain:";P",regex:/((\s);-?P|;-?P(\s|$))/gim,image:"Tongue_Out_Winking.png"},{plain:":S",regex:/((\s):-?S|:-?S(\s|$))/gim,image:"Confused.png"},{plain:":/",regex:/((\s):-?\/|:-?\/(\s|$))/gm,image:"Uncertain.png"},{plain:"8)",regex:/((\s)8-?\)|8-?\)(\s|$))/gm,image:"Sunglasses.png"},{plain:"$)",regex:/((\s)\$-?\)|\$-?\)(\s|$))/gm,image:"Greedy.png"},{plain:"oO",regex:/((\s)oO|oO(\s|$))/gm,image:"Huh.png"},{plain:":x",regex:/((\s):x|:x(\s|$))/gm,image:"Lips_Sealed.png"},{plain:":666:",regex:/((\s):666:|:666:(\s|$))/gm,image:"Devil.png"},{plain:"<3",regex:/((\s)<3|<3(\s|$))/gm,image:"Heart.png"}],emotify:function(a){var b;for(b=this.emoticons.length-1;b>=0;b--)a=a.replace(this.emoticons[b].regex,'$2$1$3');return a},linkify:function(a){return a=a.replace(/(^|[^\/])(www\.[^\.]+\.[\S]+(\b|$))/gi,"$1http://$2"),a.replace(/(\b(https?|ftp|file):\/\/[\-A-Z0-9+&@#\/%?=~_|!:,.;]*[\-A-Z0-9+&@#\/%=~_|])/gi,'$1')},escape:function(a){return b("
      ").text(a).html()},nl2br:function(a){return a.replace(/\r\n|\r|\n/g,"
      ")},all:function(a){return a&&(a=this.escape(a),a=this.linkify(a),a=this.emotify(a),a=this.nl2br(a)),a}},a.createHtml=function(c,d,e){e=e||0;var f,g,h,i,j,k,l,m,n,o,p;if(c.nodeType===Strophe.ElementType.NORMAL)if(i=c.nodeName.toLowerCase(),Strophe.XHTML.validTag(i))try{for(g=b("<"+i+"/>"),f=0;f0&&(k=l.join("; "),g.attr(j,k))}else g.attr(j,k);for(f=0;fd&&(r=r.substring(0,d)),r=Candy.Util.Parser.all(r),g=b.parseHTML(r)}return g},a}(Candy.Util||{},jQuery),Candy.Core.Action=function(a,b,c){return a.Jabber={Version:function(a){Candy.Core.getConnection().sendIQ($iq({type:"result",to:Candy.Util.escapeJid(a.attr("from")),from:Candy.Util.escapeJid(a.attr("to")),id:a.attr("id")}).c("query",{name:Candy.about.name,version:Candy.about.version,os:navigator.userAgent}))},SetNickname:function(a,b){b=b instanceof Array?b:Candy.Core.getRooms();var d,e,f=Candy.Core.getConnection();c.each(b,function(b){d=Candy.Util.escapeJid(b+"/"+a),e=$pres({to:d,from:f.jid,id:"pres:"+f.getUniqueId()}),Candy.Core.getConnection().send(e)})},Roster:function(){Candy.Core.getConnection().sendIQ($iq({type:"get",xmlns:b.NS.CLIENT}).c("query",{xmlns:b.NS.ROSTER}).tree())},Presence:function(a,b){var c=Candy.Core.getConnection();a=a||{},a.id||(a.id="pres:"+c.getUniqueId());var d=$pres(a).c("priority").t(Candy.Core.getOptions().presencePriority.toString()).up().c("c",c.caps.generateCapsAttrs()).up();b&&d.node.appendChild(b.node),c.send(d.tree())},Services:function(){Candy.Core.getConnection().sendIQ($iq({type:"get",xmlns:b.NS.CLIENT}).c("query",{xmlns:b.NS.DISCO_ITEMS}).tree())},Autojoin:function(){if(Candy.Core.getOptions().autojoin===!0){Candy.Core.getConnection().sendIQ($iq({type:"get",xmlns:b.NS.CLIENT}).c("query",{xmlns:b.NS.PRIVATE}).c("storage",{xmlns:b.NS.BOOKMARKS}).tree());var d=Candy.Core.getConnection().getUniqueId("pubsub");Candy.Core.addHandler(Candy.Core.Event.Jabber.Bookmarks,b.NS.PUBSUB,"iq","result",d),Candy.Core.getConnection().sendIQ($iq({type:"get",id:d}).c("pubsub",{xmlns:b.NS.PUBSUB}).c("items",{node:b.NS.BOOKMARKS}).tree())}else c.isArray(Candy.Core.getOptions().autojoin)?c.each(Candy.Core.getOptions().autojoin,function(){a.Jabber.Room.Join.apply(null,this.valueOf().split(":",2))}):c(Candy).triggerHandler("candy:core.autojoin-missing")},ResetIgnoreList:function(){Candy.Core.getConnection().sendIQ($iq({type:"set",from:Candy.Core.getUser().getEscapedJid()}).c("query",{xmlns:b.NS.PRIVACY}).c("list",{name:"ignore"}).c("item",{action:"allow",order:"0"}).tree())},RemoveIgnoreList:function(){Candy.Core.getConnection().sendIQ($iq({type:"set",from:Candy.Core.getUser().getEscapedJid()}).c("query",{xmlns:b.NS.PRIVACY}).c("list",{name:"ignore"}).tree())},GetIgnoreList:function(){var a=$iq({type:"get",from:Candy.Core.getUser().getEscapedJid()}).c("query",{xmlns:b.NS.PRIVACY}).c("list",{name:"ignore"}).tree(),c=Candy.Core.getConnection().sendIQ(a);Candy.Core.addHandler(Candy.Core.Event.Jabber.PrivacyList,null,"iq",null,c)},SetIgnoreListActive:function(){Candy.Core.getConnection().sendIQ($iq({type:"set",from:Candy.Core.getUser().getEscapedJid()}).c("query",{xmlns:b.NS.PRIVACY}).c("active",{name:"ignore"}).tree())},GetJidIfAnonymous:function(){Candy.Core.getUser().getJid()||(Candy.Core.log("[Jabber] Anonymous login"),Candy.Core.getUser().data.jid=Candy.Core.getConnection().jid)},Room:{Join:function(c,d){a.Jabber.Room.Disco(c),c=Candy.Util.escapeJid(c);var e=Candy.Core.getConnection(),f=c+"/"+Candy.Core.getUser().getNick(),g=$pres({to:f,id:"pres:"+e.getUniqueId()}).c("x",{xmlns:b.NS.MUC});d&&g.c("password").t(d),g.up().c("c",e.caps.generateCapsAttrs()),e.send(g.tree())},Leave:function(a){var b=Candy.Core.getRoom(a).getUser();a=Candy.Util.escapeJid(a),b&&Candy.Core.getConnection().muc.leave(a,b.getNick(),function(){})},Disco:function(a){Candy.Core.getConnection().sendIQ($iq({type:"get",from:Candy.Core.getUser().getEscapedJid(),to:Candy.Util.escapeJid(a)}).c("query",{xmlns:b.NS.DISCO_INFO}).tree())},Message:function(a,d,e,f){if(d=c.trim(d),""===d)return!1;var g=null;return"chat"===e&&(g=b.getResourceFromJid(a),a=b.getBareJidFromJid(a)),Candy.Core.getConnection().muc.message(a,g,d,f,e),!0},Invite:function(a,d,e,f){e=c.trim(e);var g=$msg({to:a}),h=g.c("x",{xmlns:b.NS.MUC_USER});c.each(d,function(a,c){c=b.getBareJidFromJid(c),h.c("invite",{to:c}),"undefined"!=typeof e&&""!==e&&h.c("reason",e)}),"undefined"!=typeof f&&""!==f&&h.c("password",f),Candy.Core.getConnection().send(g)},IgnoreUnignore:function(a){Candy.Core.getUser().addToOrRemoveFromPrivacyList("ignore",a),Candy.Core.Action.Jabber.Room.UpdatePrivacyList()},UpdatePrivacyList:function(){var a=Candy.Core.getUser(),b=$iq({type:"set",from:a.getEscapedJid()}).c("query",{xmlns:"jabber:iq:privacy"}).c("list",{name:"ignore"}),d=a.getPrivacyList("ignore");d.length>0?c.each(d,function(a,c){b.c("item",{type:"jid",value:Candy.Util.escapeJid(c),action:"deny",order:a}).c("message").up().up()}):b.c("item",{action:"allow",order:"0"}),Candy.Core.getConnection().sendIQ(b.tree())},Admin:{UserAction:function(a,c,d,e){a=Candy.Util.escapeJid(a),c=Candy.Util.escapeJid(c);var f={nick:b.getResourceFromJid(c)};switch(d){case"kick":f.role="none";break;case"ban":f.affiliation="outcast";break;default:return!1}return Candy.Core.getConnection().sendIQ($iq({type:"set",from:Candy.Core.getUser().getEscapedJid(),to:a}).c("query",{xmlns:b.NS.MUC_ADMIN}).c("item",f).c("reason").t(e).tree()),!0},SetSubject:function(a,b){Candy.Core.getConnection().muc.setTopic(Candy.Util.escapeJid(a),b)}}}},a}(Candy.Core.Action||{},Strophe,jQuery),Candy.Core.ChatRoom=function(a){this.room={jid:a,name:Strophe.getNodeFromJid(a)},this.user=null,this.roster=new Candy.Core.ChatRoster,this.setUser=function(a){this.user=a},this.getUser=function(){return this.user},this.getJid=function(){return this.room.jid},this.setName=function(a){this.room.name=a},this.getName=function(){return this.room.name},this.setRoster=function(a){this.roster=a},this.getRoster=function(){return this.roster}},Candy.Core.ChatRoster=function(){this.items={},this.add=function(a){this.items[a.getJid()]=a},this.remove=function(a){delete this.items[a]},this.get=function(a){return this.items[a]},this.getAll=function(){return this.items}},Candy.Core.ChatUser=function(a,b,c,d){this.ROLE_MODERATOR="moderator",this.AFFILIATION_OWNER="owner",this.data={jid:a,nick:Strophe.unescapeNode(b),affiliation:c,role:d,privacyLists:{},customData:{},previousNick:void 0},this.getJid=function(){return this.data.jid?Candy.Util.unescapeJid(this.data.jid):void 0},this.getEscapedJid=function(){return Candy.Util.escapeJid(this.data.jid)},this.setJid=function(a){this.data.jid=a},this.getNick=function(){return Strophe.unescapeNode(this.data.nick)},this.setNick=function(a){this.data.nick=a},this.getRole=function(){return this.data.role},this.setRole=function(a){this.data.role=a},this.setAffiliation=function(a){this.data.affiliation=a},this.getAffiliation=function(){return this.data.affiliation},this.isModerator=function(){return this.getRole()===this.ROLE_MODERATOR||this.getAffiliation()===this.AFFILIATION_OWNER},this.addToOrRemoveFromPrivacyList=function(a,b){this.data.privacyLists[a]||(this.data.privacyLists[a]=[]);var c=-1;return-1!==(c=this.data.privacyLists[a].indexOf(b))?this.data.privacyLists[a].splice(c,1):this.data.privacyLists[a].push(b),this.data.privacyLists[a]},this.getPrivacyList=function(a){return this.data.privacyLists[a]||(this.data.privacyLists[a]=[]),this.data.privacyLists[a]},this.setPrivacyLists=function(a){this.data.privacyLists=a},this.isInPrivacyList=function(a,b){return this.data.privacyLists[a]?-1!==this.data.privacyLists[a].indexOf(b):!1},this.setCustomData=function(a){this.data.customData=a},this.getCustomData=function(){return this.data.customData},this.setPreviousNick=function(a){this.data.previousNick=a},this.getPreviousNick=function(){return this.data.previousNick}},Candy.Core.Event=function(a,b,c){return a.Login=function(a){c(Candy).triggerHandler("candy:core.login",{presetJid:a})},a.Strophe={Connect:function(a){switch(Candy.Core.setStropheStatus(a),a){case b.Status.CONNECTED:Candy.Core.log("[Connection] Connected"),Candy.Core.Action.Jabber.GetJidIfAnonymous();case b.Status.ATTACHED:Candy.Core.log("[Connection] Attached"),Candy.Core.Action.Jabber.Presence(),Candy.Core.Action.Jabber.Autojoin(),Candy.Core.Action.Jabber.GetIgnoreList();break;case b.Status.DISCONNECTED:Candy.Core.log("[Connection] Disconnected");break;case b.Status.AUTHFAIL:Candy.Core.log("[Connection] Authentication failed");break;case b.Status.CONNECTING:Candy.Core.log("[Connection] Connecting");break;case b.Status.DISCONNECTING:Candy.Core.log("[Connection] Disconnecting");break;case b.Status.AUTHENTICATING:Candy.Core.log("[Connection] Authenticating");break;case b.Status.ERROR:case b.Status.CONNFAIL:Candy.Core.log("[Connection] Failed ("+a+")");break;default:Candy.Core.log("[Connection] What?!")}c(Candy).triggerHandler("candy:core.chat.connection",{status:a})}},a.Jabber={Version:function(a){return Candy.Core.log("[Jabber] Version"),Candy.Core.Action.Jabber.Version(c(a)),!0},Presence:function(d){return Candy.Core.log("[Jabber] Presence"),d=c(d),d.children('x[xmlns^="'+b.NS.MUC+'"]').length>0?"error"===d.attr("type")?a.Jabber.Room.PresenceError(d):a.Jabber.Room.Presence(d):c(Candy).triggerHandler("candy:core.presence",{from:d.attr("from"),stanza:d}),!0},Bookmarks:function(a){return Candy.Core.log("[Jabber] Bookmarks"),c("conference",a).each(function(){var a=c(this);a.attr("autojoin")&&Candy.Core.Action.Jabber.Room.Join(a.attr("jid"))}),!0},PrivacyList:function(b){Candy.Core.log("[Jabber] PrivacyList");var d=Candy.Core.getUser();return b=c(b),"result"===b.attr("type")?(c('list[name="ignore"] item',b).each(function(){var a=c(this);"deny"===a.attr("action")&&d.addToOrRemoveFromPrivacyList("ignore",a.attr("value"))}),Candy.Core.Action.Jabber.SetIgnoreListActive(),!1):a.Jabber.PrivacyListError(b)},PrivacyListError:function(a){return Candy.Core.log("[Jabber] PrivacyListError"),c('error[code="404"][type="cancel"] item-not-found',a)&&(Candy.Core.Action.Jabber.ResetIgnoreList(),Candy.Core.Action.Jabber.SetIgnoreListActive()),!1},Message:function(d){Candy.Core.log("[Jabber] Message"),d=c(d);var e=d.attr("from"),f=d.attr("type")||"undefined",g=d.attr("to");if("normal"===f||"undefined"===f){var h=d.find("invite"),i=d.find('x[xmlns="jabber:x:conference"]');if(h.length>0){var j=d.find("password"),k=null,l=h.find("continue"),m=null;j&&(k=j.text()),l&&(m=l.attr("thread")),c(Candy).triggerHandler("candy:core:chat:invite",{roomJid:e,from:h.attr("from")||"undefined",reason:h.find("reason").html()||"",password:k,continuedThread:m})}return i.length>0&&c(Candy).triggerHandler("candy:core:chat:invite",{roomJid:i.attr("jid"),from:e,reason:i.attr("reason")||"",password:i.attr("password"),continuedThread:i.attr("thread")}),c(Candy).triggerHandler("candy:core:chat:message:normal",{type:f||"normal",message:d}),!0}return"groupchat"!==f&&"chat"!==f&&"error"!==f&&"headline"!==f?(c(Candy).triggerHandler("candy:core:chat:message:other",{type:f,message:d}),!0):(e===b.getDomainFromJid(e)||"groupchat"!==f&&"chat"!==f&&"error"!==f?g||e!==b.getDomainFromJid(e)?g&&e===b.getDomainFromJid(e)&&c(Candy).triggerHandler("candy:core.chat.message.server",{type:f||"message",subject:d.children("subject").text(),message:d.children("body").text()}):c(Candy).triggerHandler("candy:core.chat.message.admin",{type:f||"message",message:d.children("body").text()}):a.Jabber.Room.Message(d),!0)},Room:{Leave:function(a){Candy.Core.log("[Jabber:Room] Leave"),a=c(a);var d=Candy.Util.unescapeJid(a.attr("from")),e=b.getBareJidFromJid(d);if(!Candy.Core.getRoom(e))return!0;var f,g,h=Candy.Core.getRoom(e).getName(),i=a.find("item"),j="leave";if(delete Candy.Core.getRooms()[e],"none"===i.attr("role")){var k=a.find("status").attr("code");"307"===k?j="kick":"301"===k&&(j="ban"),f=i.find("reason").text(),g=i.find("actor").attr("jid")}var l=new Candy.Core.ChatUser(d,b.getResourceFromJid(d),i.attr("affiliation"),i.attr("role"));return c(Candy).triggerHandler("candy:core.presence.leave",{roomJid:e,roomName:h,type:j,reason:f,actor:g,user:l}),!0},Disco:function(a){if(Candy.Core.log("[Jabber:Room] Disco"),a=c(a),!a.find('identity[category="conference"]').length)return!0;var d=b.getBareJidFromJid(Candy.Util.unescapeJid(a.attr("from")));Candy.Core.getRooms()[d]||(Candy.Core.getRooms()[d]=new Candy.Core.ChatRoom(d));var e=a.find("identity");if(e.length){var f=e.attr("name"),g=Candy.Core.getRoom(d);null===g.getName()&&g.setName(b.unescapeNode(f))}return!0},Presence:function(d){Candy.Core.log("[Jabber:Room] Presence");var e=Candy.Util.unescapeJid(d.attr("from")),f=b.getBareJidFromJid(e),g=d.attr("type"),h=d.find("status"),i=!1,j=!1;if(h.length)for(var k=0,l=h.length;l>k;k++){var m=c(h[k]),n=m.attr("code");"303"===n?j=!0:"210"===n&&(i=!0)}var o=Candy.Core.getRoom(f);o||(Candy.Core.getRooms()[f]=new Candy.Core.ChatRoom(f),o=Candy.Core.getRoom(f));var p=o.getUser()?o.getUser():Candy.Core.getUser();if(b.getResourceFromJid(e)===p.getNick()&&"unavailable"===g&&j===!1)return a.Jabber.Room.Leave(d),!0;var q,r,s,t=o.getRoster(),u=d.find("item");if("unavailable"!==g)if(t.get(e)){r=t.get(e);var v=u.attr("role"),w=u.attr("affiliation");r.setRole(v),r.setAffiliation(w),q="join"}else s=b.getResourceFromJid(e),r=new Candy.Core.ChatUser(e,s,u.attr("affiliation"),u.attr("role")),null!==o.getUser()||Candy.Core.getUser().getNick()!==s&&!i||(o.setUser(r),p=r),t.add(r),q="join";else r=t.get(e),t.remove(e),j?(s=u.attr("nick"),q="nickchange",r.setPreviousNick(r.getNick()),r.setNick(s),r.setJid(b.getBareJidFromJid(e)+"/"+s),t.add(r)):(q="leave","none"===u.attr("role")&&("307"===d.find("status").attr("code")?q="kick":"301"===d.find("status").attr("code")&&(q="ban")));return c(Candy).triggerHandler("candy:core.presence.room",{roomJid:f,roomName:o.getName(),user:r,action:q,currentUser:p}),!0},PresenceError:function(a){Candy.Core.log("[Jabber:Room] Presence Error");var d=Candy.Util.unescapeJid(a.attr("from")),e=b.getBareJidFromJid(d),f=Candy.Core.getRooms()[e],g=f.getName();return Candy.Core.removeRoom(e),f=void 0,c(Candy).triggerHandler("candy:core.presence.error",{msg:a,type:a.children("error").children()[0].tagName.toLowerCase(),roomJid:e,roomName:g}),!0},Message:function(a){Candy.Core.log("[Jabber:Room] Message");var d,e,f;if(a.children("subject").length>0&&a.children("subject").text().length>0&&"groupchat"===a.attr("type"))d=Candy.Util.unescapeJid(b.getBareJidFromJid(a.attr("from"))),e={name:b.getNodeFromJid(d),body:a.children("subject").text(),type:"subject"};else if("error"===a.attr("type")){var g=a.children("error");g.children("text").length>0&&(d=a.attr("from"),e={type:"info",body:g.children("text").text()})}else{if(!(a.children("body").length>0)){if(a.children("composing").length>0||a.children("inactive").length>0||a.children("paused").length>0){d=Candy.Util.unescapeJid(a.attr("from")),f=b.getResourceFromJid(d);var h;return a.children("composing").length>0?h="composing":a.children("paused").length>0?h="paused":a.children("inactive").length>0?h="inactive":a.children("gone").length>0&&(h="gone"),c(Candy).triggerHandler("candy:core.message.chatstate",{name:f,roomJid:d,chatstate:h}),!0}return!0}if("chat"===a.attr("type")||"normal"===a.attr("type")){d=Candy.Util.unescapeJid(a.attr("from"));var i=b.getBareJidFromJid(d),j=!Candy.Core.getRoom(i);f=j?b.getNodeFromJid(d):b.getResourceFromJid(d),e={name:f,body:a.children("body").text(),type:a.attr("type"),isNoConferenceRoomJid:j}}else{d=Candy.Util.unescapeJid(b.getBareJidFromJid(a.attr("from")));var k=b.getResourceFromJid(a.attr("from"));if(k)k=b.unescapeNode(k),e={name:k,body:a.children("body").text(),type:a.attr("type")};else{if(!Candy.View.Pane.Chat.rooms[a.attr("from")])return!0;e={name:"",body:a.children("body").text(),type:"info"}}}var l=a.children('html[xmlns="'+b.NS.XHTML_IM+'"]');if(Candy.View.getOptions().enableXHTML===!0&&l.length>0){var m=l.children('body[xmlns="'+b.NS.XHTML+'"]').first().html();e.xhtmlMessage=m}}var n=a.children(a.children("delay")?"delay":'x[xmlns="'+b.NS.DELAY+'"]'),o=void 0!==n?n.attr("stamp"):null;return c(Candy).triggerHandler("candy:core.message",{roomJid:d,message:e,timestamp:o}),!0}}},a}(Candy.Core.Event||{},Strophe,jQuery),Candy.View.Observer=function(a,b){var c=!0;return a.Chat={Connection:function(a,d){var e="candy:view.connection.status-"+d.status;if(b(Candy).triggerHandler(e)===!1)return!1;switch(d.status){case Strophe.Status.CONNECTING:case Strophe.Status.AUTHENTICATING:Candy.View.Pane.Chat.Modal.show(b.i18n._("statusConnecting"),!1,!0);break;case Strophe.Status.ATTACHED:case Strophe.Status.CONNECTED:c===!0&&(Candy.View.Pane.Chat.Modal.show(b.i18n._("statusConnected")),Candy.View.Pane.Chat.Modal.hide());break;case Strophe.Status.DISCONNECTING:Candy.View.Pane.Chat.Modal.show(b.i18n._("statusDisconnecting"),!1,!0);break;case Strophe.Status.DISCONNECTED:var f=Candy.Core.isAnonymousConnection()?Strophe.getDomainFromJid(Candy.Core.getUser().getJid()):null;Candy.View.Pane.Chat.Modal.showLoginForm(b.i18n._("statusDisconnected"),f);break;case Strophe.Status.AUTHFAIL:Candy.View.Pane.Chat.Modal.showLoginForm(b.i18n._("statusAuthfail"));break;default:Candy.View.Pane.Chat.Modal.show(b.i18n._("status",d.status))}},Message:function(a,b){"message"===b.type?Candy.View.Pane.Chat.adminMessage(b.subject||"",b.message):("chat"===b.type||"groupchat"===b.type)&&Candy.View.Pane.Chat.onInfoMessage(Candy.View.getCurrent().roomJid,b.subject||"",b.message)}},a.Presence={update:function(c,d){if("leave"===d.type){var e=Candy.View.Pane.Room.getUser(d.roomJid);Candy.View.Pane.Room.close(d.roomJid),a.Presence.notifyPrivateChats(e,d.type)}else if("kick"===d.type||"ban"===d.type){var f,g=d.actor?Strophe.getNodeFromJid(d.actor):null,h=[d.roomName];switch(g&&h.push(g),d.type){case"kick":f=b.i18n._(g?"youHaveBeenKickedBy":"youHaveBeenKicked",h);break;case"ban":f=b.i18n._(g?"youHaveBeenBannedBy":"youHaveBeenBanned",h)}Candy.View.Pane.Chat.Modal.show(Mustache.to_html(Candy.View.Template.Chat.Context.adminMessageReason,{reason:d.reason,_action:f,_reason:b.i18n._("reasonWas",[d.reason])})),setTimeout(function(){Candy.View.Pane.Chat.Modal.hide(function(){Candy.View.Pane.Room.close(d.roomJid),a.Presence.notifyPrivateChats(d.user,d.type)})},5e3);var i={type:d.type,reason:d.reason,roomJid:d.roomJid,user:d.user};b(Candy).triggerHandler("candy:view.presence",[i])}else if(d.roomJid){if(d.roomJid=Candy.Util.unescapeJid(d.roomJid),!Candy.View.Pane.Chat.rooms[d.roomJid]){if(Candy.View.Pane.Room.init(d.roomJid,d.roomName)===!1)return!1;Candy.View.Pane.Room.show(d.roomJid)}Candy.View.Pane.Roster.update(d.roomJid,d.user,d.action,d.currentUser),Candy.View.Pane.Chat.rooms[d.user.getJid()]&&"nickchange"!==d.action&&(Candy.View.Pane.Roster.update(d.user.getJid(),d.user,d.action,d.currentUser),Candy.View.Pane.PrivateRoom.setStatus(d.user.getJid(),d.action))}},notifyPrivateChats:function(a,b){Candy.Core.log("[View:Observer] notify Private Chats");var c;for(c in Candy.View.Pane.Chat.rooms)Candy.View.Pane.Chat.rooms.hasOwnProperty(c)&&Candy.View.Pane.Room.getUser(c)&&a.getJid()===Candy.View.Pane.Room.getUser(c).getJid()&&(Candy.View.Pane.Roster.update(c,a,b,a),Candy.View.Pane.PrivateRoom.setStatus(c,b))}},a.PresenceError=function(a,c){switch(c.type){case"not-authorized":var d;c.msg.children("x").children("password").length>0&&(d=b.i18n._("passwordEnteredInvalid",[c.roomName])),Candy.View.Pane.Chat.Modal.showEnterPasswordForm(c.roomJid,c.roomName,d);break;case"conflict":Candy.View.Pane.Chat.Modal.showNicknameConflictForm(c.roomJid);break;case"registration-required":Candy.View.Pane.Chat.Modal.showError("errorMembersOnly",[c.roomName]);break;case"service-unavailable":Candy.View.Pane.Chat.Modal.showError("errorMaxOccupantsReached",[c.roomName])}},a.Message=function(a,b){"subject"===b.message.type?(Candy.View.Pane.Chat.rooms[b.roomJid]||(Candy.View.Pane.Room.init(b.roomJid,b.message.name),Candy.View.Pane.Room.show(b.roomJid)),Candy.View.Pane.Room.setSubject(b.roomJid,b.message.body)):"info"===b.message.type?Candy.View.Pane.Chat.infoMessage(b.roomJid,b.message.body):("chat"!==b.message.type||Candy.View.Pane.Chat.rooms[b.roomJid]||Candy.View.Pane.PrivateRoom.open(b.roomJid,b.message.name,!1,b.message.isNoConferenceRoomJid),Candy.View.Pane.Message.show(b.roomJid,b.message.name,b.message.body,b.message.xhtmlMessage,b.timestamp))},a.Login=function(a,b){Candy.View.Pane.Chat.Modal.showLoginForm(null,b.presetJid)},a.AutojoinMissing=function(){c=!1,Candy.View.Pane.Chat.Modal.showError("errorAutojoinMissing")},a}(Candy.View.Observer||{},jQuery),Candy.View.Pane=function(a,b){return a.Window={_hasFocus:!0,_plainTitle:document.title,_unreadMessagesCount:0,autoscroll:!0,hasFocus:function(){return a.Window._hasFocus},increaseUnreadMessages:function(){a.Window.renderUnreadMessages(++a.Window._unreadMessagesCount)},reduceUnreadMessages:function(b){a.Window._unreadMessagesCount-=b,a.Window._unreadMessagesCount<=0?a.Window.clearUnreadMessages():a.Window.renderUnreadMessages(a.Window._unreadMessagesCount)},clearUnreadMessages:function(){a.Window._unreadMessagesCount=0,document.title=a.Window._plainTitle},renderUnreadMessages:function(b){document.title=Candy.View.Template.Window.unreadmessages.replace("{{count}}",b).replace("{{title}}",a.Window._plainTitle)},onFocus:function(){a.Window._hasFocus=!0,Candy.View.getCurrent().roomJid&&(a.Room.setFocusToForm(Candy.View.getCurrent().roomJid),a.Chat.clearUnreadMessages(Candy.View.getCurrent().roomJid)) +},onBlur:function(){a.Window._hasFocus=!1}},a.Chat={rooms:[],addTab:function(c,d,e){var f=Candy.Util.jidToId(c),g=Mustache.to_html(Candy.View.Template.Chat.tab,{roomJid:c,roomId:f,name:d||Strophe.getNodeFromJid(c),privateUserChat:function(){return"chat"===e},roomType:e}),h=b(g).appendTo("#chat-tabs");h.click(a.Chat.tabClick),b("a.close",h).click(a.Chat.tabClose),a.Chat.fitTabs()},getTab:function(a){return b("#chat-tabs").children('li[data-roomjid="'+a+'"]')},removeTab:function(b){a.Chat.getTab(b).remove(),a.Chat.fitTabs()},setActiveTab:function(a){b("#chat-tabs").children().each(function(){var c=b(this);c.attr("data-roomjid")===a?c.addClass("active"):c.removeClass("active")})},increaseUnreadMessages:function(b){var c=this.getTab(b).find(".unread");c.show().text(""!==c.text()?parseInt(c.text(),10)+1:1),"chat"===a.Chat.rooms[b].type&&a.Window.increaseUnreadMessages()},clearUnreadMessages:function(b){var c=a.Chat.getTab(b).find(".unread");a.Window.reduceUnreadMessages(c.text()),c.hide().text("")},tabClick:function(c){var d=Candy.View.getCurrent().roomJid;a.Chat.rooms[d].scrollPosition=a.Room.getPane(d,".message-pane-wrapper").scrollTop(),a.Room.show(b(this).attr("data-roomjid")),c.preventDefault()},tabClose:function(){var c=b(this).parent().attr("data-roomjid");return"chat"===a.Chat.rooms[c].type?a.Room.close(c):Candy.Core.Action.Jabber.Room.Leave(c),!1},allTabsClosed:function(){Candy.Core.disconnect(),a.Chat.Toolbar.hide()},fitTabs:function(){var a=b("#chat-tabs").innerWidth(),c=0,d=b("#chat-tabs").children();if(d.each(function(){c+=b(this).css({width:"auto",overflow:"visible"}).outerWidth(!0)}),c>a){var e=d.outerWidth(!0)-d.width(),f=Math.floor(a/d.length)-e;d.css({width:f,overflow:"hidden"})}},adminMessage:function(c,d){if(Candy.View.getCurrent().roomJid){var e=Mustache.to_html(Candy.View.Template.Chat.adminMessage,{subject:c,message:d,sender:b.i18n._("administratorMessageSubject"),time:Candy.Util.localizedTime((new Date).toGMTString())});b("#chat-rooms").children().each(function(){a.Room.appendToMessagePane(b(this).attr("data-roomjid"),e)}),a.Room.scrollToBottom(Candy.View.getCurrent().roomJid),b(Candy).triggerHandler("candy:view.chat.admin-message",{subject:c,message:d})}},infoMessage:function(b,c,d){a.Chat.onInfoMessage(b,c,d)},onInfoMessage:function(c,d,e){if(Candy.View.getCurrent().roomJid){var f=Mustache.to_html(Candy.View.Template.Chat.infoMessage,{subject:d,message:b.i18n._(e),time:Candy.Util.localizedTime((new Date).toGMTString())});a.Room.appendToMessagePane(c,f),Candy.View.getCurrent().roomJid===c&&a.Room.scrollToBottom(Candy.View.getCurrent().roomJid)}},Toolbar:{_supportsNativeAudio:!1,init:function(){b("#emoticons-icon").click(function(b){a.Chat.Context.showEmoticonsMenu(b.currentTarget),b.stopPropagation()}),b("#chat-autoscroll-control").click(a.Chat.Toolbar.onAutoscrollControlClick);var c=document.createElement("audio");a.Chat.Toolbar._supportsNativeAudio=!(!c.canPlayType||!c.canPlayType("audio/mpeg;").replace(/no/,"")),b("#chat-sound-control").click(a.Chat.Toolbar.onSoundControlClick),Candy.Util.cookieExists("candy-nosound")&&b("#chat-sound-control").click(),b("#chat-statusmessage-control").click(a.Chat.Toolbar.onStatusMessageControlClick),Candy.Util.cookieExists("candy-nostatusmessages")&&b("#chat-statusmessage-control").click()},show:function(){b("#chat-toolbar").show()},hide:function(){b("#chat-toolbar").hide()},update:function(c){var d=b("#chat-toolbar").find(".context"),e=a.Room.getUser(c);e&&e.isModerator()?d.show().click(function(b){a.Chat.Context.show(b.currentTarget,c),b.stopPropagation()}):d.hide(),a.Chat.Toolbar.updateUsercount(a.Chat.rooms[c].usercount)},playSound:function(){a.Chat.Toolbar.onPlaySound()},onPlaySound:function(){try{if(a.Chat.Toolbar._supportsNativeAudio)new Audio(Candy.View.getOptions().assets+"notify.mp3").play();else{var b=document.getElementById("chat-sound-player");b.SetVariable("method:stop",""),b.SetVariable("method:play","")}}catch(c){}},onSoundControlClick:function(){var c=b("#chat-sound-control");c.hasClass("checked")?(a.Chat.Toolbar.playSound=function(){},Candy.Util.setCookie("candy-nosound","1",365)):(a.Chat.Toolbar.playSound=function(){a.Chat.Toolbar.onPlaySound()},Candy.Util.deleteCookie("candy-nosound")),c.toggleClass("checked")},onAutoscrollControlClick:function(){var c=b("#chat-autoscroll-control");c.hasClass("checked")?(a.Room.scrollToBottom=function(b){a.Room.onScrollToStoredPosition(b)},a.Window.autoscroll=!1):(a.Room.scrollToBottom=function(b){a.Room.onScrollToBottom(b)},a.Room.scrollToBottom(Candy.View.getCurrent().roomJid),a.Window.autoscroll=!0),c.toggleClass("checked")},onStatusMessageControlClick:function(){var c=b("#chat-statusmessage-control");c.hasClass("checked")?(a.Chat.infoMessage=function(){},Candy.Util.setCookie("candy-nostatusmessages","1",365)):(a.Chat.infoMessage=function(b,c,d){a.Chat.onInfoMessage(b,c,d)},Candy.Util.deleteCookie("candy-nostatusmessages")),c.toggleClass("checked")},updateUsercount:function(a){b("#chat-usercount").text(a)}},Modal:{show:function(c,d,e){d?a.Chat.Modal.showCloseControl():a.Chat.Modal.hideCloseControl(),e?a.Chat.Modal.showSpinner():a.Chat.Modal.hideSpinner(),b("#chat-modal").stop(!1,!0),b("#chat-modal-body").html(c),b("#chat-modal").fadeIn("fast"),b("#chat-modal-overlay").show()},hide:function(a){b("#chat-modal").fadeOut("fast",function(){b("#chat-modal-body").text(""),b("#chat-modal-overlay").hide()}),b(document).keydown(function(a){27===a.which&&a.preventDefault()}),a&&a()},showSpinner:function(){b("#chat-modal-spinner").show()},hideSpinner:function(){b("#chat-modal-spinner").hide()},showCloseControl:function(){b("#admin-message-cancel").show().click(function(b){a.Chat.Modal.hide(),b.preventDefault()}),b(document).keydown(function(b){27===b.which&&(a.Chat.Modal.hide(),b.preventDefault())})},hideCloseControl:function(){b("#admin-message-cancel").hide().click(function(){})},showLoginForm:function(c,d){a.Chat.Modal.show((c?c:"")+Mustache.to_html(Candy.View.Template.Login.form,{_labelNickname:b.i18n._("labelNickname"),_labelUsername:b.i18n._("labelUsername"),_labelPassword:b.i18n._("labelPassword"),_loginSubmit:b.i18n._("loginSubmit"),displayPassword:!Candy.Core.isAnonymousConnection(),displayUsername:!d,displayNickname:Candy.Core.isAnonymousConnection(),presetJid:d?d:!1})),b("#login-form").children(":input:first").focus(),b("#login-form").submit(function(){var a=b("#username").val(),c=b("#password").val();if(Candy.Core.isAnonymousConnection())Candy.Core.connect(d,null,a);else{var e=Candy.Core.getUser()&&a.indexOf("@")<0?a+"@"+Strophe.getDomainFromJid(Candy.Core.getUser().getJid()):a;e.indexOf("@")<0&&!Candy.Core.getUser()?Candy.View.Pane.Chat.Modal.showLoginForm(b.i18n._("loginInvalid")):Candy.Core.connect(e,c)}return!1})},showEnterPasswordForm:function(c,d,e){a.Chat.Modal.show(Mustache.to_html(Candy.View.Template.PresenceError.enterPasswordForm,{roomName:d,_labelPassword:b.i18n._("labelPassword"),_label:e?e:b.i18n._("enterRoomPassword",[d]),_joinSubmit:b.i18n._("enterRoomPasswordSubmit")}),!0),b("#password").focus(),b("#enter-password-form").submit(function(){var d=b("#password").val();return a.Chat.Modal.hide(function(){Candy.Core.Action.Jabber.Room.Join(c,d)}),!1})},showNicknameConflictForm:function(c){a.Chat.Modal.show(Mustache.to_html(Candy.View.Template.PresenceError.nicknameConflictForm,{_labelNickname:b.i18n._("labelNickname"),_label:b.i18n._("nicknameConflict"),_loginSubmit:b.i18n._("loginSubmit")})),b("#nickname").focus(),b("#nickname-conflict-form").submit(function(){var d=b("#nickname").val();return a.Chat.Modal.hide(function(){Candy.Core.getUser().data.nick=d,Candy.Core.Action.Jabber.Room.Join(c)}),!1})},showError:function(c,d){a.Chat.Modal.show(Mustache.to_html(Candy.View.Template.PresenceError.displayError,{_error:b.i18n._(c,d)}),!0)}},Tooltip:{show:function(a,c){var d=b("#tooltip"),e=b(a.currentTarget);if(c||(c=e.attr("data-tooltip")),0===d.length){var f=Mustache.to_html(Candy.View.Template.Chat.tooltip);b("#chat-pane").append(f),d=b("#tooltip")}b("#context-menu").hide(),d.stop(!1,!0),d.children("div").html(c);var g=e.offset(),h=Candy.Util.getPosLeftAccordingToWindowBounds(d,g.left),i=Candy.Util.getPosTopAccordingToWindowBounds(d,g.top);d.css({left:h.px,top:i.px}).removeClass("left-top left-bottom right-top right-bottom").addClass(h.backgroundPositionAlignment+"-"+i.backgroundPositionAlignment).fadeIn("fast"),e.mouseleave(function(a){a.stopPropagation(),b("#tooltip").stop(!1,!0).fadeOut("fast",function(){b(this).css({top:0,left:0})})})}},Context:{init:function(){if(0===b("#context-menu").length){var a=Mustache.to_html(Candy.View.Template.Chat.Context.menu);b("#chat-pane").append(a),b("#context-menu").mouseleave(function(){b(this).fadeOut("fast")})}},show:function(c,d,e){c=b(c);var f=a.Chat.rooms[d].id,g=b("#context-menu"),h=b("ul li",g);b("#tooltip").hide(),e||(e=Candy.Core.getUser()),h.remove();var i,j=this.getMenuLinks(d,e,c),k=function(a,c){return function(d){d.data.callback(d,a,c),b("#context-menu").hide()}};for(i in j)if(j.hasOwnProperty(i)){var l=j[i],m=Mustache.to_html(Candy.View.Template.Chat.Context.menulinks,{roomId:f,"class":l["class"],id:i,label:l.label});b("ul",g).append(m),b("#context-menu-"+i).bind("click",l,k(d,e))}if(i){var n=c.offset(),o=Candy.Util.getPosLeftAccordingToWindowBounds(g,n.left),p=Candy.Util.getPosTopAccordingToWindowBounds(g,n.top);return g.css({left:o.px,top:p.px}).removeClass("left-top left-bottom right-top right-bottom").addClass(o.backgroundPositionAlignment+"-"+p.backgroundPositionAlignment).fadeIn("fast"),b(Candy).triggerHandler("candy:view.roster.after-context-menu",{roomJid:d,user:e,element:g}),!0}},getMenuLinks:function(c,d,e){var f,g,h={roomJid:c,user:d,elem:e,menulinks:this.initialMenuLinks(e)};b(Candy).triggerHandler("candy:view.roster.context-menu",h),f=h.menulinks;for(g in f)f.hasOwnProperty(g)&&void 0!==f[g].requiredPermission&&!f[g].requiredPermission(d,a.Room.getUser(c),e)&&delete f[g];return f},initialMenuLinks:function(){return{"private":{requiredPermission:function(a,b){return b.getNick()!==a.getNick()&&Candy.Core.getRoom(Candy.View.getCurrent().roomJid)&&!Candy.Core.getUser().isInPrivacyList("ignore",a.getJid())},"class":"private",label:b.i18n._("privateActionLabel"),callback:function(a,c,d){b("#user-"+Candy.Util.jidToId(c)+"-"+Candy.Util.jidToId(d.getJid())).click()}},ignore:{requiredPermission:function(a,b){return b.getNick()!==a.getNick()&&!Candy.Core.getUser().isInPrivacyList("ignore",a.getJid())},"class":"ignore",label:b.i18n._("ignoreActionLabel"),callback:function(a,b,c){Candy.View.Pane.Room.ignoreUser(b,c.getJid())}},unignore:{requiredPermission:function(a,b){return b.getNick()!==a.getNick()&&Candy.Core.getUser().isInPrivacyList("ignore",a.getJid())},"class":"unignore",label:b.i18n._("unignoreActionLabel"),callback:function(a,b,c){Candy.View.Pane.Room.unignoreUser(b,c.getJid())}},kick:{requiredPermission:function(a,b){return b.getNick()!==a.getNick()&&b.isModerator()&&!a.isModerator()},"class":"kick",label:b.i18n._("kickActionLabel"),callback:function(c,d,e){a.Chat.Modal.show(Mustache.to_html(Candy.View.Template.Chat.Context.contextModalForm,{_label:b.i18n._("reason"),_submit:b.i18n._("kickActionLabel")}),!0),b("#context-modal-field").focus(),b("#context-modal-form").submit(function(){return Candy.Core.Action.Jabber.Room.Admin.UserAction(d,e.getJid(),"kick",b("#context-modal-field").val()),a.Chat.Modal.hide(),!1})}},ban:{requiredPermission:function(a,b){return b.getNick()!==a.getNick()&&b.isModerator()&&!a.isModerator()},"class":"ban",label:b.i18n._("banActionLabel"),callback:function(c,d,e){a.Chat.Modal.show(Mustache.to_html(Candy.View.Template.Chat.Context.contextModalForm,{_label:b.i18n._("reason"),_submit:b.i18n._("banActionLabel")}),!0),b("#context-modal-field").focus(),b("#context-modal-form").submit(function(){return Candy.Core.Action.Jabber.Room.Admin.UserAction(d,e.getJid(),"ban",b("#context-modal-field").val()),a.Chat.Modal.hide(),!1})}},subject:{requiredPermission:function(a,b){return b.getNick()===a.getNick()&&b.isModerator()},"class":"subject",label:b.i18n._("setSubjectActionLabel"),callback:function(c,d){a.Chat.Modal.show(Mustache.to_html(Candy.View.Template.Chat.Context.contextModalForm,{_label:b.i18n._("subject"),_submit:b.i18n._("setSubjectActionLabel")}),!0),b("#context-modal-field").focus(),b("#context-modal-form").submit(function(c){Candy.Core.Action.Jabber.Room.Admin.SetSubject(d,b("#context-modal-field").val()),a.Chat.Modal.hide(),c.preventDefault()})}}}},showEmoticonsMenu:function(a){a=b(a);var c,d=a.offset(),e=b("#context-menu"),f=b("ul",e),g="";for(b("#tooltip").hide(),c=Candy.Util.Parser.emoticons.length-1;c>=0;c--)g=''+Candy.Util.Parser.emoticons[c].plain+''+g;f.html('
    • '+g+"
    • "),f.find("img").click(function(){var a=Candy.View.Pane.Room.getPane(Candy.View.getCurrent().roomJid,".message-form").children(".field"),c=a.val(),d=b(this).attr("alt")+" ";a.val(c?c+" "+d:d).focus()});var h=Candy.Util.getPosLeftAccordingToWindowBounds(e,d.left),i=Candy.Util.getPosTopAccordingToWindowBounds(e,d.top);return e.css({left:h.px,top:i.px}).removeClass("left-top left-bottom right-top right-bottom").addClass(h.backgroundPositionAlignment+"-"+i.backgroundPositionAlignment).fadeIn("fast"),!0}}},a.Room={init:function(c,d,e){e=e||"groupchat",c=Candy.Util.unescapeJid(c);var f={roomJid:c,type:e};if(b(Candy).triggerHandler("candy:view.room.before-add",f)===!1)return!1;Candy.Util.isEmptyObject(a.Chat.rooms)&&a.Chat.Toolbar.show();var g=Candy.Util.jidToId(c);return a.Chat.rooms[c]={id:g,usercount:0,name:d,type:e,messageCount:0,scrollPosition:-1},b("#chat-rooms").append(Mustache.to_html(Candy.View.Template.Room.pane,{roomId:g,roomJid:c,roomType:e,form:{_messageSubmit:b.i18n._("messageSubmit")},roster:{_userOnline:b.i18n._("userOnline")}},{roster:Candy.View.Template.Roster.pane,messages:Candy.View.Template.Message.pane,form:Candy.View.Template.Room.form})),a.Chat.addTab(c,d,e),a.Room.getPane(c,".message-form").submit(a.Message.submit),f.element=a.Room.getPane(c),b(Candy).triggerHandler("candy:view.room.after-add",f),g},show:function(c){var d,e=a.Chat.rooms[c].id;b(".room-pane").each(function(){var f=b(this);d={roomJid:f.attr("data-roomjid"),element:f},f.attr("id")==="chat-room-"+e?(f.show(),Candy.View.getCurrent().roomJid=c,a.Chat.setActiveTab(c),a.Chat.Toolbar.update(c),a.Chat.clearUnreadMessages(c),a.Room.setFocusToForm(c),a.Room.scrollToBottom(c),b(Candy).triggerHandler("candy:view.room.after-show",d)):(f.hide(),b(Candy).triggerHandler("candy:view.room.after-hide",d))})},setSubject:function(c,d){d=Candy.Util.Parser.linkify(Candy.Util.Parser.escape(d));var e=Mustache.to_html(Candy.View.Template.Room.subject,{subject:d,roomName:a.Chat.rooms[c].name,_roomSubject:b.i18n._("roomSubject"),time:Candy.Util.localizedTime((new Date).toGMTString())});a.Room.appendToMessagePane(c,e),a.Room.scrollToBottom(c),b(Candy).triggerHandler("candy:view.room.after-subject-change",{roomJid:c,element:a.Room.getPane(c),subject:d})},close:function(c){a.Chat.removeTab(c),a.Window.clearUnreadMessages(),a.Room.getPane(c).remove();var d=b("#chat-rooms").children();Candy.View.getCurrent().roomJid===c&&(Candy.View.getCurrent().roomJid=null,0===d.length?a.Chat.allTabsClosed():a.Room.show(d.last().attr("data-roomjid"))),delete a.Chat.rooms[c],b(Candy).triggerHandler("candy:view.room.after-close",{roomJid:c})},appendToMessagePane:function(b,c){a.Room.getPane(b,".message-pane").append(c),a.Chat.rooms[b].messageCount++,a.Room.sliceMessagePane(b)},sliceMessagePane:function(b){if(a.Window.autoscroll){var c=Candy.View.getOptions().messages;a.Chat.rooms[b].messageCount>c.limit&&(a.Room.getPane(b,".message-pane").children().slice(0,c.remove).remove(),a.Chat.rooms[b].messageCount-=c.remove)}},scrollToBottom:function(b){a.Room.onScrollToBottom(b)},onScrollToBottom:function(b){var c=a.Room.getPane(b,".message-pane-wrapper");c.scrollTop(c.prop("scrollHeight"))},onScrollToStoredPosition:function(b){if(a.Chat.rooms[b].scrollPosition>-1){var c=a.Room.getPane(b,".message-pane-wrapper");c.scrollTop(a.Chat.rooms[b].scrollPosition),a.Chat.rooms[b].scrollPosition=-1}},setFocusToForm:function(b){var c=a.Room.getPane(b,".message-form");if(c)try{c.children(".field")[0].focus()}catch(d){}},setUser:function(c,d){a.Chat.rooms[c].user=d;var e=a.Room.getPane(c),f=b("#chat-pane");e.attr("data-userjid",d.getJid()),d.isModerator()?(d.getRole()===d.ROLE_MODERATOR&&f.addClass("role-moderator"),d.getAffiliation()===d.AFFILIATION_OWNER&&f.addClass("affiliation-owner")):f.removeClass("role-moderator affiliation-owner"),a.Chat.Context.init()},getUser:function(b){return a.Chat.rooms[b].user},ignoreUser:function(a,b){Candy.Core.Action.Jabber.Room.IgnoreUnignore(b),Candy.View.Pane.Room.addIgnoreIcon(a,b)},unignoreUser:function(a,b){Candy.Core.Action.Jabber.Room.IgnoreUnignore(b),Candy.View.Pane.Room.removeIgnoreIcon(a,b)},addIgnoreIcon:function(a,c){Candy.View.Pane.Chat.rooms[c]&&b("#user-"+Candy.View.Pane.Chat.rooms[c].id+"-"+Candy.Util.jidToId(c)).addClass("status-ignored"),Candy.View.Pane.Chat.rooms[Strophe.getBareJidFromJid(a)]&&b("#user-"+Candy.View.Pane.Chat.rooms[Strophe.getBareJidFromJid(a)].id+"-"+Candy.Util.jidToId(c)).addClass("status-ignored")},removeIgnoreIcon:function(a,c){Candy.View.Pane.Chat.rooms[c]&&b("#user-"+Candy.View.Pane.Chat.rooms[c].id+"-"+Candy.Util.jidToId(c)).removeClass("status-ignored"),Candy.View.Pane.Chat.rooms[Strophe.getBareJidFromJid(a)]&&b("#user-"+Candy.View.Pane.Chat.rooms[Strophe.getBareJidFromJid(a)].id+"-"+Candy.Util.jidToId(c)).removeClass("status-ignored")},getPane:function(c,d){return a.Chat.rooms[c]?d?a.Chat.rooms[c]["pane-"+d]?a.Chat.rooms[c]["pane-"+d]:(a.Chat.rooms[c]["pane-"+d]=b("#chat-room-"+a.Chat.rooms[c].id).find(d),a.Chat.rooms[c]["pane-"+d]):b("#chat-room-"+a.Chat.rooms[c].id):void 0},changeDataUserJidIfUserIsMe:function(a,c){if(c.getNick()===Candy.Core.getUser().getNick()){var d=b("#chat-room-"+a);d.attr("data-userjid",Strophe.getBareJidFromJid(d.attr("data-userjid"))+"/"+c.getNick())}}},a.PrivateRoom={open:function(c,d,e,f){var g=f?Candy.Core.getUser():a.Room.getUser(Strophe.getBareJidFromJid(c)),h={roomJid:c,roomName:d,type:"chat"};return b(Candy).triggerHandler("candy:view.private-room.before-open",h)===!1?!1:Candy.Core.getUser().isInPrivacyList("ignore",c)?!1:a.Chat.rooms[c]||a.Room.init(c,d,"chat")!==!1?(e&&a.Room.show(c),a.Roster.update(c,new Candy.Core.ChatUser(c,d),"join",g),a.Roster.update(c,g,"join",g),a.PrivateRoom.setStatus(c,"join"),f&&a.Chat.infoMessage(c,b.i18n._("presenceUnknownWarningSubject"),b.i18n._("presenceUnknownWarning")),h.element=a.Room.getPane(c),void b(Candy).triggerHandler("candy:view.private-room.after-open",h)):!1},setStatus:function(b,c){var d=a.Room.getPane(b,".message-form");"join"===c?(a.Chat.getTab(b).addClass("online").removeClass("offline"),d.children(".field").removeAttr("disabled"),d.children(".submit").removeAttr("disabled"),a.Chat.getTab(b)):"leave"===c&&(a.Chat.getTab(b).addClass("offline").removeClass("online"),d.children(".field").attr("disabled",!0),d.children(".submit").attr("disabled",!0))},changeNick:function(c,d){Candy.Core.log("[View:Pane:PrivateRoom] changeNick");var e,f,g=c+"/"+d.getPreviousNick(),h=c+"/"+d.getNick(),i=Candy.Util.jidToId(g),j=Candy.Util.jidToId(h),k=a.Chat.rooms[g];a.Chat.rooms[h]&&a.Room.close(h),k?(k.name=d.getNick(),k.id=j,a.Chat.rooms[h]=k,delete a.Chat.rooms[g],e=b("#chat-room-"+i),e&&(e.attr("data-roomjid",h),e.attr("id","chat-room-"+j),f=b('#chat-tabs li[data-roomjid="'+g+'"]'),f.attr("data-roomjid",h),f.children("a.label").text("@"+d.getNick()),Candy.View.getCurrent().roomJid===g&&(Candy.View.getCurrent().roomJid=h))):(e=b('.room-pane.roomtype-chat[data-userjid="'+g+'"]'),e.length&&(i=Candy.Util.jidToId(e.attr("data-roomjid")),e.attr("data-userjid",h))),e&&e.length&&a.Roster.changeNick(i,d)}},a.Roster={update:function(c,d,e,f){Candy.Core.log("[View:Pane:Roster] "+e);var g=a.Chat.rooms[c].id,h=Candy.Util.jidToId(d.getJid()),i=-1,j=b("#user-"+g+"-"+h),k={roomJid:c,user:d,action:e,element:j};if(b(Candy).triggerHandler("candy:view.roster.before-update",k),"join"===e){i=1;var l=Mustache.to_html(Candy.View.Template.Roster.user,{roomId:g,userId:h,userJid:d.getJid(),nick:d.getNick(),displayNick:Candy.Util.crop(d.getNick(),Candy.View.getOptions().crop.roster.nickname),role:d.getRole(),affiliation:d.getAffiliation(),me:void 0!==f&&d.getNick()===f.getNick(),tooltipRole:b.i18n._("tooltipRole"),tooltipIgnored:b.i18n._("tooltipIgnored")});if(j.length<1){var m=!1,n=a.Room.getPane(c,".roster-pane");if(n.children().length>0){var o=d.getNick().toUpperCase();n.children().each(function(){var a=b(this);return a.attr("data-nick").toUpperCase()>o?(a.before(l),m=!0,!1):!0})}m||n.append(l),a.Roster.showJoinAnimation(d,h,g,c,f)}else i=0,j.replaceWith(l),b("#user-"+g+"-"+h).css({opacity:1}).show(),void 0!==f&&d.getNick()===f.getNick()&&a.Room.getUser(c)&&a.Chat.Toolbar.update(c);void 0!==f&&f.getNick()===d.getNick()?a.Room.setUser(c,d):b("#user-"+g+"-"+h).click(a.Roster.userClick),b("#user-"+g+"-"+h+" .context").click(function(b){a.Chat.Context.show(b.currentTarget,c,d),b.stopPropagation()}),void 0!==f&&f.isInPrivacyList("ignore",d.getJid())&&Candy.View.Pane.Room.addIgnoreIcon(c,d.getJid())}else if("leave"===e)a.Roster.leaveAnimation("user-"+g+"-"+h),"chat"===a.Chat.rooms[c].type?a.Chat.onInfoMessage(c,b.i18n._("userLeftRoom",[d.getNick()])):a.Chat.infoMessage(c,b.i18n._("userLeftRoom",[d.getNick()]));else if("nickchange"===e){i=0,a.Roster.changeNick(g,d),a.Room.changeDataUserJidIfUserIsMe(g,d),a.PrivateRoom.changeNick(c,d);var p=b.i18n._("userChangedNick",[d.getPreviousNick(),d.getNick()]);a.Chat.onInfoMessage(c,p)}else"kick"===e?(a.Roster.leaveAnimation("user-"+g+"-"+h),a.Chat.onInfoMessage(c,b.i18n._("userHasBeenKickedFromRoom",[d.getNick()]))):"ban"===e&&(a.Roster.leaveAnimation("user-"+g+"-"+h),a.Chat.onInfoMessage(c,b.i18n._("userHasBeenBannedFromRoom",[d.getNick()])));Candy.View.Pane.Chat.rooms[c].usercount+=i,c===Candy.View.getCurrent().roomJid&&Candy.View.Pane.Chat.Toolbar.updateUsercount(Candy.View.Pane.Chat.rooms[c].usercount),k.element=b("#user-"+g+"-"+h),b(Candy).triggerHandler("candy:view.roster.after-update",k)},userClick:function(){var c=b(this);a.PrivateRoom.open(c.attr("data-jid"),c.attr("data-nick"),!0)},showJoinAnimation:function(c,d,e,f,g){var h="user-"+e+"-"+d,i=b("#"+h);c.getPreviousNick()&&i&&i.is(":visible")!==!1||(a.Roster.joinAnimation(h),void 0!==g&&c.getNick()!==g.getNick()&&a.Room.getUser(f)&&("chat"===a.Chat.rooms[f].type?a.Chat.onInfoMessage(f,b.i18n._("userJoinedRoom",[c.getNick()])):a.Chat.infoMessage(f,b.i18n._("userJoinedRoom",[c.getNick()]))))},joinAnimation:function(a){b("#"+a).stop(!0).slideDown("normal",function(){b(this).animate({opacity:1})})},leaveAnimation:function(a){b("#"+a).stop(!0).attr("id","#"+a+"-leaving").animate({opacity:0},{complete:function(){b(this).slideUp("normal",function(){b(this).remove()})}})},changeNick:function(a,c){Candy.Core.log("[View:Pane:Roster] changeNick");var d=Strophe.getBareJidFromJid(c.getJid())+"/"+c.getPreviousNick(),e="user-"+a+"-"+Candy.Util.jidToId(d),f=b("#"+e);f.attr("data-nick",c.getNick()),f.attr("data-jid",c.getJid()),f.children("div.label").text(c.getNick()),f.attr("id","user-"+a+"-"+Candy.Util.jidToId(c.getJid()))}},a.Message={submit:function(c){var d,e=Candy.View.getCurrent().roomJid,f=Candy.View.Pane.Chat.rooms[e].type,g=b(this).children(".field").val().substring(0,Candy.View.getOptions().crop.message.body),h={roomJid:e,message:g,xhtmlMessage:d};return b(Candy).triggerHandler("candy:view.message.before-send",h)===!1?void c.preventDefault():(g=h.message,d=h.xhtmlMessage,Candy.Core.Action.Jabber.Room.Message(e,g,f,d),"chat"===f&&g&&a.Message.show(e,a.Room.getUser(e).getNick(),g),b(this).children(".field").val("").focus(),void c.preventDefault())},show:function(c,d,e,f,g){e=Candy.Util.Parser.all(e.substring(0,Candy.View.getOptions().crop.message.body)),f&&(f=Candy.Util.parseAndCropXhtml(f,Candy.View.getOptions().crop.message.body));var h={roomJid:c,name:d,message:e,xhtmlMessage:f};if(b(Candy).triggerHandler("candy:view.message.before-show",h)!==!1&&(e=h.message,f=h.xhtmlMessage,void 0!==f&&f.length>0&&(e=f),e)){var i={template:Candy.View.Template.Message.item,templateData:{name:d,displayName:Candy.Util.crop(d,Candy.View.getOptions().crop.message.nickname),message:e,time:Candy.Util.localizedTime(g||(new Date).toGMTString())}};b(Candy).triggerHandler("candy:view.message.before-render",i);var j=Mustache.to_html(i.template,i.templateData);a.Room.appendToMessagePane(c,j);var k=a.Room.getPane(c,".message-pane").children().last();k.find("a.label").click(function(b){b.preventDefault();var e=Candy.Core.getRoom(c);return e&&d!==a.Room.getUser(Candy.View.getCurrent().roomJid).getNick()&&e.getRoster().get(c+"/"+d)&&Candy.View.Pane.PrivateRoom.open(c+"/"+d,d,!0)===!1?!1:void 0}),Candy.View.getCurrent().roomJid===c&&a.Window.hasFocus()||(a.Chat.increaseUnreadMessages(c),"chat"!==Candy.View.Pane.Chat.rooms[c].type||a.Window.hasFocus()||a.Chat.Toolbar.playSound()),Candy.View.getCurrent().roomJid===c&&a.Room.scrollToBottom(c),h.element=k,b(Candy).triggerHandler("candy:view.message.after-show",h)}}},a}(Candy.View.Pane||{},jQuery),Candy.View.Template=function(a){return a.Window={unreadmessages:"({{count}}) {{title}}"},a.Chat={pane:'
      {{> tabs}}{{> toolbar}}{{> rooms}}
      {{> modal}}',rooms:'
      ',tabs:'
        ',tab:'
      • {{#privateUserChat}}@{{/privateUserChat}}{{name}}×
      • ',modal:'
        ',adminMessage:'
      • {{time}}
        {{sender}}{{subject}} {{message}}
      • ',infoMessage:'
      • {{time}}
        {{subject}} {{message}}
      • ',toolbar:'
        • {{> soundcontrol}}
        ',soundcontrol:'',Context:{menu:'
          ',menulinks:'
        • {{label}}
        • ',contextModalForm:'
          ',adminMessageReason:'×

          {{_action}}

          {{#reason}}

          {{_reason}}

          {{/reason}}'},tooltip:'
          '},a.Room={pane:'
          {{> roster}}{{> messages}}{{> form}}
          ',subject:'
        • {{time}}
          {{roomName}}{{_roomSubject}} {{{subject}}}
        • ',form:'
          '},a.Roster={pane:'
          ',user:'
          {{displayNick}}
          '},a.Message={pane:'
            ',item:'
          • {{time}}
            {{displayName}}{{{message}}}
          • '},a.Login={form:''},a.PresenceError={enterPasswordForm:'{{_label}}
            ',nicknameConflictForm:'{{_label}}
            ',displayError:"{{_error}}"},a}(Candy.View.Template||{}),Candy.View.Translation={en:{status:"Status: %s",statusConnecting:"Connecting...",statusConnected:"Connected",statusDisconnecting:"Disconnecting...",statusDisconnected:"Disconnected",statusAuthfail:"Authentication failed",roomSubject:"Subject:",messageSubmit:"Send",labelUsername:"Username:",labelNickname:"Nickname:",labelPassword:"Password:",loginSubmit:"Login",loginInvalid:"Invalid JID",reason:"Reason:",subject:"Subject:",reasonWas:"Reason was: %s.",kickActionLabel:"Kick",youHaveBeenKickedBy:"You have been kicked from %2$s by %1$s",youHaveBeenKicked:"You have been kicked from %s",banActionLabel:"Ban",youHaveBeenBannedBy:"You have been banned from %1$s by %2$s",youHaveBeenBanned:"You have been banned from %s",privateActionLabel:"Private chat",ignoreActionLabel:"Ignore",unignoreActionLabel:"Unignore",setSubjectActionLabel:"Change Subject",administratorMessageSubject:"Administrator",userJoinedRoom:"%s joined the room.",userLeftRoom:"%s left the room.",userHasBeenKickedFromRoom:"%s has been kicked from the room.",userHasBeenBannedFromRoom:"%s has been banned from the room.",userChangedNick:"%1$s has changed his nickname to %2$s.",presenceUnknownWarningSubject:"Notice:",presenceUnknownWarning:"This user might be offline. We can't track his presence.",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Moderator",tooltipIgnored:"You ignore this user",tooltipEmoticons:"Emoticons",tooltipSound:"Play sound for new private messages",tooltipAutoscroll:"Autoscroll",tooltipStatusmessage:"Display status messages",tooltipAdministration:"Room Administration",tooltipUsercount:"Room Occupants",enterRoomPassword:'Room "%s" is password protected.',enterRoomPasswordSubmit:"Join room",passwordEnteredInvalid:'Invalid password for room "%s".',nicknameConflict:"Username already in use. Please choose another one.",errorMembersOnly:'You can\'t join room "%s": Insufficient rights.',errorMaxOccupantsReached:'You can\'t join room "%s": Too many occupants.',errorAutojoinMissing:"No autojoin parameter set in configuration. Please set one to continue.",antiSpamMessage:"Please do not spam. You have been blocked for a short-time."},de:{status:"Status: %s",statusConnecting:"Verbinden...",statusConnected:"Verbunden",statusDisconnecting:"Verbindung trennen...",statusDisconnected:"Verbindung getrennt",statusAuthfail:"Authentifizierung fehlgeschlagen",roomSubject:"Thema:",messageSubmit:"Senden",labelUsername:"Benutzername:",labelNickname:"Spitzname:",labelPassword:"Passwort:",loginSubmit:"Anmelden",loginInvalid:"Ungültige JID",reason:"Begründung:",subject:"Titel:",reasonWas:"Begründung: %s.",kickActionLabel:"Kick",youHaveBeenKickedBy:"Du wurdest soeben aus dem Raum %1$s gekickt (%2$s)",youHaveBeenKicked:"Du wurdest soeben aus dem Raum %s gekickt",banActionLabel:"Ban",youHaveBeenBannedBy:"Du wurdest soeben aus dem Raum %1$s verbannt (%2$s)",youHaveBeenBanned:"Du wurdest soeben aus dem Raum %s verbannt",privateActionLabel:"Privater Chat",ignoreActionLabel:"Ignorieren",unignoreActionLabel:"Nicht mehr ignorieren",setSubjectActionLabel:"Thema ändern",administratorMessageSubject:"Administrator",userJoinedRoom:"%s hat soeben den Raum betreten.",userLeftRoom:"%s hat soeben den Raum verlassen.",userHasBeenKickedFromRoom:"%s ist aus dem Raum gekickt worden.",userHasBeenBannedFromRoom:"%s ist aus dem Raum verbannt worden.",userChangedNick:"%1$s hat den Nicknamen zu %2$s geändert.",presenceUnknownWarningSubject:"Hinweis:",presenceUnknownWarning:"Dieser Benutzer könnte bereits abgemeldet sein. Wir können seine Anwesenheit nicht verfolgen.",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Moderator",tooltipIgnored:"Du ignorierst diesen Benutzer",tooltipEmoticons:"Smileys",tooltipSound:"Ton abspielen bei neuen privaten Nachrichten",tooltipAutoscroll:"Autoscroll",tooltipStatusmessage:"Statusnachrichten anzeigen",tooltipAdministration:"Raum Administration",tooltipUsercount:"Anzahl Benutzer im Raum",enterRoomPassword:'Raum "%s" ist durch ein Passwort geschützt.',enterRoomPasswordSubmit:"Raum betreten",passwordEnteredInvalid:'Inkorrektes Passwort für Raum "%s".',nicknameConflict:"Der Benutzername wird bereits verwendet. Bitte wähle einen anderen.",errorMembersOnly:'Du kannst den Raum "%s" nicht betreten: Ungenügende Rechte.',errorMaxOccupantsReached:'Du kannst den Raum "%s" nicht betreten: Benutzerlimit erreicht.',errorAutojoinMissing:'Keine "autojoin" Konfiguration gefunden. Bitte setze eine konfiguration um fortzufahren.',antiSpamMessage:"Bitte nicht spammen. Du wurdest für eine kurze Zeit blockiert."},fr:{status:"Status : %s",statusConnecting:"Connexion…",statusConnected:"Connecté.",statusDisconnecting:"Déconnexion…",statusDisconnected:"Déconnecté.",statusAuthfail:"L'authentification a échoué",roomSubject:"Sujet :",messageSubmit:"Envoyer",labelUsername:"Nom d'utilisateur :",labelPassword:"Mot de passe :",loginSubmit:"Connexion",loginInvalid:"JID invalide",reason:"Motif :",subject:"Titre :",reasonWas:"Motif : %s.",kickActionLabel:"Kick",youHaveBeenKickedBy:"Vous avez été expulsé du salon %1$s (%2$s)",youHaveBeenKicked:"Vous avez été expulsé du salon %s",banActionLabel:"Ban",youHaveBeenBannedBy:"Vous avez été banni du salon %1$s (%2$s)",youHaveBeenBanned:"Vous avez été banni du salon %s",privateActionLabel:"Chat privé",ignoreActionLabel:"Ignorer",unignoreActionLabel:"Ne plus ignorer",setSubjectActionLabel:"Changer le sujet",administratorMessageSubject:"Administrateur",userJoinedRoom:"%s vient d'entrer dans le salon.",userLeftRoom:"%s vient de quitter le salon.",userHasBeenKickedFromRoom:"%s a été expulsé du salon.",userHasBeenBannedFromRoom:"%s a été banni du salon.",presenceUnknownWarningSubject:"Note :",presenceUnknownWarning:"Cet utilisateur n'est malheureusement plus connecté, le message ne sera pas envoyé.",dateFormat:"dd/mm/yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Modérateur",tooltipIgnored:"Vous ignorez cette personne",tooltipEmoticons:"Smileys",tooltipSound:"Jouer un son lors de la réception de nouveaux messages privés",tooltipAutoscroll:"Défilement automatique",tooltipStatusmessage:"Messages d'état",tooltipAdministration:"Administration du salon",tooltipUsercount:"Nombre d'utilisateurs dans le salon",enterRoomPassword:'Le salon "%s" est protégé par un mot de passe.',enterRoomPasswordSubmit:"Entrer dans le salon",passwordEnteredInvalid:'Le mot de passe pour le salon "%s" est invalide.',nicknameConflict:"Le nom d'utilisateur est déjà utilisé. Veuillez en choisir un autre.",errorMembersOnly:'Vous ne pouvez pas entrer dans le salon "%s" : droits insuffisants.',errorMaxOccupantsReached:'Vous ne pouvez pas entrer dans le salon "%s": Limite d\'utilisateur atteint.',antiSpamMessage:"Merci de ne pas envoyer de spam. Vous avez été bloqué pendant une courte période.."},nl:{status:"Status: %s",statusConnecting:"Verbinding maken...",statusConnected:"Verbinding is gereed",statusDisconnecting:"Verbinding verbreken...",statusDisconnected:"Verbinding is verbroken",statusAuthfail:"Authenticatie is mislukt",roomSubject:"Onderwerp:",messageSubmit:"Verstuur",labelUsername:"Gebruikersnaam:",labelPassword:"Wachtwoord:",loginSubmit:"Inloggen",loginInvalid:"JID is onjuist",reason:"Reden:",subject:"Onderwerp:",reasonWas:"De reden was: %s.",kickActionLabel:"Verwijderen",youHaveBeenKickedBy:"Je bent verwijderd van %1$s door %2$s",youHaveBeenKicked:"Je bent verwijderd van %s",banActionLabel:"Blokkeren",youHaveBeenBannedBy:"Je bent geblokkeerd van %1$s door %2$s",youHaveBeenBanned:"Je bent geblokkeerd van %s",privateActionLabel:"Prive gesprek",ignoreActionLabel:"Negeren",unignoreActionLabel:"Niet negeren",setSubjectActionLabel:"Onderwerp wijzigen",administratorMessageSubject:"Beheerder",userJoinedRoom:"%s komt de chat binnen.",userLeftRoom:"%s heeft de chat verlaten.",userHasBeenKickedFromRoom:"%s is verwijderd.",userHasBeenBannedFromRoom:"%s is geblokkeerd.",presenceUnknownWarningSubject:"Mededeling:",presenceUnknownWarning:"Deze gebruiker is waarschijnlijk offline, we kunnen zijn/haar aanwezigheid niet vaststellen.",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Moderator",tooltipIgnored:"Je negeert deze gebruiker",tooltipEmoticons:"Emotie-iconen",tooltipSound:"Speel een geluid af bij nieuwe privé berichten.",tooltipAutoscroll:"Automatisch scrollen",tooltipStatusmessage:"Statusberichten weergeven",tooltipAdministration:"Instellingen",tooltipUsercount:"Gebruikers",enterRoomPassword:'De Chatroom "%s" is met een wachtwoord beveiligd.',enterRoomPasswordSubmit:"Ga naar Chatroom",passwordEnteredInvalid:'Het wachtwoord voor de Chatroom "%s" is onjuist.',nicknameConflict:"De gebruikersnaam is reeds in gebruik. Probeer a.u.b. een andere gebruikersnaam.",errorMembersOnly:'Je kunt niet deelnemen aan de Chatroom "%s": Je hebt onvoldoende rechten.',errorMaxOccupantsReached:'Je kunt niet deelnemen aan de Chatroom "%s": Het maximum aantal gebruikers is bereikt.',antiSpamMessage:"Het is niet toegestaan om veel berichten naar de server te versturen. Je bent voor een korte periode geblokkeerd."},es:{status:"Estado: %s",statusConnecting:"Conectando...",statusConnected:"Conectado",statusDisconnecting:"Desconectando...",statusDisconnected:"Desconectado",statusAuthfail:"Falló la autenticación",roomSubject:"Asunto:",messageSubmit:"Enviar",labelUsername:"Usuario:",labelPassword:"Clave:",loginSubmit:"Entrar",loginInvalid:"JID no válido",reason:"Razón:",subject:"Asunto:",reasonWas:"La razón fue: %s.",kickActionLabel:"Expulsar",youHaveBeenKickedBy:"Has sido expulsado de %1$s por %2$s",youHaveBeenKicked:"Has sido expulsado de %s",banActionLabel:"Prohibir",youHaveBeenBannedBy:"Has sido expulsado permanentemente de %1$s por %2$s",youHaveBeenBanned:"Has sido expulsado permanentemente de %s",privateActionLabel:"Chat privado",ignoreActionLabel:"Ignorar",unignoreActionLabel:"No ignorar",setSubjectActionLabel:"Cambiar asunto",administratorMessageSubject:"Administrador",userJoinedRoom:"%s se ha unido a la sala.",userLeftRoom:"%s ha dejado la sala.",userHasBeenKickedFromRoom:"%s ha sido expulsado de la sala.",userHasBeenBannedFromRoom:"%s ha sido expulsado permanentemente de la sala.",presenceUnknownWarningSubject:"Atención:",presenceUnknownWarning:"Éste usuario podría estar desconectado..",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Moderador",tooltipIgnored:"Ignoras a éste usuario",tooltipEmoticons:"Emoticonos",tooltipSound:"Reproducir un sonido para nuevos mensajes privados",tooltipAutoscroll:"Desplazamiento automático",tooltipStatusmessage:"Mostrar mensajes de estado",tooltipAdministration:"Administración de la sala",tooltipUsercount:"Usuarios en la sala",enterRoomPassword:'La sala "%s" está protegida mediante contraseña.',enterRoomPasswordSubmit:"Unirse a la sala",passwordEnteredInvalid:'Contraseña incorrecta para la sala "%s".',nicknameConflict:"El nombre de usuario ya está siendo utilizado. Por favor elija otro.",errorMembersOnly:'No se puede unir a la sala "%s": no tiene privilegios suficientes.',errorMaxOccupantsReached:'No se puede unir a la sala "%s": demasiados participantes.',antiSpamMessage:"Por favor, no hagas spam. Has sido bloqueado temporalmente."},cn:{status:"状态: %s",statusConnecting:"连接中...",statusConnected:"已连接",statusDisconnecting:"断开连接中...",statusDisconnected:"已断开连接",statusAuthfail:"认证失败",roomSubject:"主题:",messageSubmit:"发送",labelUsername:"用户名:",labelPassword:"密码:",loginSubmit:"登录",loginInvalid:"用户名不合法",reason:"原因:",subject:"主题:",reasonWas:"原因是: %s.",kickActionLabel:"踢除",youHaveBeenKickedBy:"你在 %1$s 被管理者 %2$s 请出房间",banActionLabel:"禁言",youHaveBeenBannedBy:"你在 %1$s 被管理者 %2$s 禁言",privateActionLabel:"单独对话",ignoreActionLabel:"忽略",unignoreActionLabel:"不忽略",setSubjectActionLabel:"变更主题",administratorMessageSubject:"管理员",userJoinedRoom:"%s 加入房间",userLeftRoom:"%s 离开房间",userHasBeenKickedFromRoom:"%s 被请出这个房间",userHasBeenBannedFromRoom:"%s 被管理者禁言",presenceUnknownWarningSubject:"注意:",presenceUnknownWarning:"这个会员可能已经下线,不能追踪到他的连接信息",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"管理",tooltipIgnored:"你忽略了这个会员",tooltipEmoticons:"表情",tooltipSound:"新消息发音",tooltipAutoscroll:"滚动条",tooltipStatusmessage:"禁用状态消息",tooltipAdministration:"房间管理",tooltipUsercount:"房间占有者",enterRoomPassword:'登录房间 "%s" 需要密码.',enterRoomPasswordSubmit:"加入房间",passwordEnteredInvalid:'登录房间 "%s" 的密码不正确',nicknameConflict:"用户名已经存在,请另选一个",errorMembersOnly:'您的权限不够,不能登录房间 "%s" ',errorMaxOccupantsReached:'房间 "%s" 的人数已达上限,您不能登录',antiSpamMessage:"因为您在短时间内发送过多的消息 服务器要阻止您一小段时间。"},ja:{status:"ステータス: %s",statusConnecting:"接続中…",statusConnected:"接続されました",statusDisconnecting:"ディスコネクト中…",statusDisconnected:"ディスコネクトされました",statusAuthfail:"認証に失敗しました",roomSubject:"トピック:",messageSubmit:"送信",labelUsername:"ユーザーネーム:",labelPassword:"パスワード:",loginSubmit:"ログイン",loginInvalid:"ユーザーネームが正しくありません",reason:"理由:",subject:"トピック:",reasonWas:"理由: %s。",kickActionLabel:"キック",youHaveBeenKickedBy:"あなたは%2$sにより%1$sからキックされました。",youHaveBeenKicked:"あなたは%sからキックされました。",banActionLabel:"アカウントバン",youHaveBeenBannedBy:"あなたは%2$sにより%1$sからアカウントバンされました。",youHaveBeenBanned:"あなたは%sからアカウントバンされました。",privateActionLabel:"プライベートメッセージ",ignoreActionLabel:"無視する",unignoreActionLabel:"無視をやめる",setSubjectActionLabel:"トピックを変える",administratorMessageSubject:"管理者",userJoinedRoom:"%sは入室しました。",userLeftRoom:"%sは退室しました。",userHasBeenKickedFromRoom:"%sは部屋からキックされました。",userHasBeenBannedFromRoom:"%sは部屋からアカウントバンされました。",presenceUnknownWarningSubject:"忠告:",presenceUnknownWarning:"このユーザーのステータスは不明です。",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"モデレーター",tooltipIgnored:"このユーザーを無視設定にしている",tooltipEmoticons:"絵文字",tooltipSound:"新しいメッセージが届くたびに音を鳴らす",tooltipAutoscroll:"オートスクロール",tooltipStatusmessage:"ステータスメッセージを表示",tooltipAdministration:"部屋の管理",tooltipUsercount:"この部屋の参加者の数",enterRoomPassword:'"%s"の部屋に入るにはパスワードが必要です。',enterRoomPasswordSubmit:"部屋に入る",passwordEnteredInvalid:'"%s"のパスワードと異なるパスワードを入力しました。',nicknameConflict:"このユーザーネームはすでに利用されているため、別のユーザーネームを選んでください。",errorMembersOnly:'"%s"の部屋に入ることができません: 利用権限を満たしていません。',errorMaxOccupantsReached:'"%s"の部屋に入ることができません: 参加者の数はすでに上限に達しました。',antiSpamMessage:"スパムなどの行為はやめてください。あなたは一時的にブロックされました。"},sv:{status:"Status: %s",statusConnecting:"Ansluter...",statusConnected:"Ansluten",statusDisconnecting:"Kopplar från...",statusDisconnected:"Frånkopplad",statusAuthfail:"Autentisering misslyckades",roomSubject:"Ämne:",messageSubmit:"Skicka",labelUsername:"Användarnamn:",labelPassword:"Lösenord:",loginSubmit:"Logga in",loginInvalid:"Ogiltigt JID",reason:"Anledning:",subject:"Ämne:",reasonWas:"Anledningen var: %s.",kickActionLabel:"Sparka ut",youHaveBeenKickedBy:"Du har blivit utsparkad från %2$s av %1$s",youHaveBeenKicked:"Du har blivit utsparkad från %s",banActionLabel:"Bannlys",youHaveBeenBannedBy:"Du har blivit bannlyst från %1$s av %2$s",youHaveBeenBanned:"Du har blivit bannlyst från %s",privateActionLabel:"Privat chatt",ignoreActionLabel:"Blockera",unignoreActionLabel:"Avblockera",setSubjectActionLabel:"Ändra ämne",administratorMessageSubject:"Administratör",userJoinedRoom:"%s kom in i rummet.",userLeftRoom:"%s har lämnat rummet.",userHasBeenKickedFromRoom:"%s har blivit utsparkad ur rummet.",userHasBeenBannedFromRoom:"%s har blivit bannlyst från rummet.",presenceUnknownWarningSubject:"Notera:",presenceUnknownWarning:"Denna användare kan vara offline. Vi kan inte följa dennes närvaro.",dateFormat:"yyyy-mm-dd",timeFormat:"HH:MM:ss",tooltipRole:"Moderator",tooltipIgnored:"Du blockerar denna användare",tooltipEmoticons:"Smilies",tooltipSound:"Spela upp ett ljud vid nytt privat meddelande",tooltipAutoscroll:"Autoskrolla",tooltipStatusmessage:"Visa statusmeddelanden",tooltipAdministration:"Rumadministrering",tooltipUsercount:"Antal användare i rummet",enterRoomPassword:'Rummet "%s" är lösenordsskyddat.',enterRoomPasswordSubmit:"Anslut till rum",passwordEnteredInvalid:'Ogiltigt lösenord för rummet "%s".',nicknameConflict:"Upptaget användarnamn. Var god välj ett annat.",errorMembersOnly:'Du kan inte ansluta till rummet "%s": Otillräckliga rättigheter.',errorMaxOccupantsReached:'Du kan inte ansluta till rummet "%s": Rummet är fullt.',antiSpamMessage:"Var god avstå från att spamma. Du har blivit blockerad för en kort stund."},it:{status:"Stato: %s",statusConnecting:"Connessione...",statusConnected:"Connessione",statusDisconnecting:"Disconnessione...",statusDisconnected:"Disconnesso",statusAuthfail:"Autenticazione fallita",roomSubject:"Oggetto:",messageSubmit:"Invia",labelUsername:"Nome utente:",labelPassword:"Password:",loginSubmit:"Login",loginInvalid:"JID non valido",reason:"Ragione:",subject:"Oggetto:",reasonWas:"Ragione precedente: %s.",kickActionLabel:"Espelli",youHaveBeenKickedBy:"Sei stato espulso da %2$s da %1$s",youHaveBeenKicked:"Sei stato espulso da %s",banActionLabel:"Escluso",youHaveBeenBannedBy:"Sei stato escluso da %1$s da %2$s",youHaveBeenBanned:"Sei stato escluso da %s",privateActionLabel:"Stanza privata",ignoreActionLabel:"Ignora",unignoreActionLabel:"Non ignorare",setSubjectActionLabel:"Cambia oggetto",administratorMessageSubject:"Amministratore",userJoinedRoom:"%s si è unito alla stanza.",userLeftRoom:"%s ha lasciato la stanza.",userHasBeenKickedFromRoom:"%s è stato espulso dalla stanza.",userHasBeenBannedFromRoom:"%s è stato escluso dalla stanza.",presenceUnknownWarningSubject:"Nota:",presenceUnknownWarning:"Questo utente potrebbe essere offline. Non possiamo tracciare la sua presenza.",dateFormat:"dd/mm/yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Moderatore",tooltipIgnored:"Stai ignorando questo utente",tooltipEmoticons:"Emoticons",tooltipSound:"Riproduci un suono quando arrivano messaggi privati",tooltipAutoscroll:"Autoscroll",tooltipStatusmessage:"Mostra messaggi di stato",tooltipAdministration:"Amministrazione stanza",tooltipUsercount:"Partecipanti alla stanza",enterRoomPassword:'La stanza "%s" è protetta da password.',enterRoomPasswordSubmit:"Unisciti alla stanza",passwordEnteredInvalid:'Password non valida per la stanza "%s".',nicknameConflict:"Nome utente già in uso. Scegline un altro.",errorMembersOnly:'Non puoi unirti alla stanza "%s": Permessi insufficienti.',errorMaxOccupantsReached:'Non puoi unirti alla stanza "%s": Troppi partecipanti.',antiSpamMessage:"Per favore non scrivere messaggi pubblicitari. Sei stato bloccato per un po' di tempo."},pt:{status:"Status: %s",statusConnecting:"Conectando...",statusConnected:"Conectado",statusDisconnecting:"Desligando...",statusDisconnected:"Desligado",statusAuthfail:"Falha na autenticação",roomSubject:"Assunto:",messageSubmit:"Enviar",labelUsername:"Usuário:",labelPassword:"Senha:",loginSubmit:"Entrar",loginInvalid:"JID inválido",reason:"Motivo:",subject:"Assunto:",reasonWas:"O motivo foi: %s.",kickActionLabel:"Excluir",youHaveBeenKickedBy:"Você foi excluido de %1$s por %2$s",youHaveBeenKicked:"Você foi excluido de %s",banActionLabel:"Bloquear",youHaveBeenBannedBy:"Você foi excluido permanentemente de %1$s por %2$s",youHaveBeenBanned:"Você foi excluido permanentemente de %s",privateActionLabel:"Bate-papo privado",ignoreActionLabel:"Ignorar",unignoreActionLabel:"Não ignorar",setSubjectActionLabel:"Trocar Assunto",administratorMessageSubject:"Administrador",userJoinedRoom:"%s entrou na sala.",userLeftRoom:"%s saiu da sala.",userHasBeenKickedFromRoom:"%s foi excluido da sala.",userHasBeenBannedFromRoom:"%s foi excluido permanentemente da sala.",presenceUnknownWarning:"Este usuário pode estar desconectado. Não é possível determinar o status.",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Moderador",tooltipIgnored:"Você ignora este usuário",tooltipEmoticons:"Emoticons",tooltipSound:"Reproduzir o som para novas mensagens privados",tooltipAutoscroll:"Deslocamento automático",tooltipStatusmessage:"Mostrar mensagens de status",tooltipAdministration:"Administração da sala",tooltipUsercount:"Usuários na sala",enterRoomPassword:'A sala "%s" é protegida por senha.',enterRoomPasswordSubmit:"Junte-se à sala",passwordEnteredInvalid:'Senha incorreta para a sala "%s".',nicknameConflict:"O nome de usuário já está em uso. Por favor, escolha outro.",errorMembersOnly:'Você não pode participar da sala "%s": privilégios insuficientes.',errorMaxOccupantsReached:'Você não pode participar da sala "%s": muitos participantes.',antiSpamMessage:"Por favor, não envie spam. Você foi bloqueado temporariamente."},pt_br:{status:"Estado: %s",statusConnecting:"Conectando...",statusConnected:"Conectado",statusDisconnecting:"Desconectando...",statusDisconnected:"Desconectado",statusAuthfail:"Autenticação falhou",roomSubject:"Assunto:",messageSubmit:"Enviar",labelUsername:"Usuário:",labelPassword:"Senha:",loginSubmit:"Entrar",loginInvalid:"JID inválido",reason:"Motivo:",subject:"Assunto:",reasonWas:"Motivo foi: %s.",kickActionLabel:"Derrubar",youHaveBeenKickedBy:"Você foi derrubado de %2$s por %1$s",youHaveBeenKicked:"Você foi derrubado de %s",banActionLabel:"Banir",youHaveBeenBannedBy:"Você foi banido de %1$s por %2$s",youHaveBeenBanned:"Você foi banido de %s",privateActionLabel:"Conversa privada",ignoreActionLabel:"Ignorar",unignoreActionLabel:"Não ignorar",setSubjectActionLabel:"Mudar Assunto",administratorMessageSubject:"Administrador",userJoinedRoom:"%s entrou na sala.",userLeftRoom:"%s saiu da sala.",userHasBeenKickedFromRoom:"%s foi derrubado da sala.",userHasBeenBannedFromRoom:"%s foi banido da sala.",presenceUnknownWarningSubject:"Aviso:",presenceUnknownWarning:"Este usuário pode estar desconectado.. Não conseguimos rastrear sua presença..",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Moderador",tooltipIgnored:"Você ignora este usuário",tooltipEmoticons:"Emoticons",tooltipSound:"Tocar som para novas mensagens privadas",tooltipAutoscroll:"Auto-rolagem",tooltipStatusmessage:"Exibir mensagens de estados",tooltipAdministration:"Administração de Sala",tooltipUsercount:"Participantes da Sala",enterRoomPassword:'Sala "%s" é protegida por senha.',enterRoomPasswordSubmit:"Entrar na sala",passwordEnteredInvalid:'Senha inváida para sala "%s".',nicknameConflict:"Nome de usuário já em uso. Por favor escolha outro.",errorMembersOnly:'Você não pode entrar na sala "%s": privilégios insuficientes.',errorMaxOccupantsReached:'Você não pode entrar na sala "%s": máximo de participantes atingido.',antiSpamMessage:"Por favor, não faça spam. Você foi bloqueado temporariamente."},ru:{status:"Статус: %s",statusConnecting:"Подключение...",statusConnected:"Подключено",statusDisconnecting:"Отключение...",statusDisconnected:"Отключено",statusAuthfail:"Неверный логин",roomSubject:"Топик:",messageSubmit:"Послать",labelUsername:"Имя:",labelPassword:"Пароль:",loginSubmit:"Логин",loginInvalid:"Неверный JID",reason:"Причина:",subject:"Топик:",reasonWas:"Причина была: %s.",kickActionLabel:"Выбросить",youHaveBeenKickedBy:"Пользователь %1$s выбросил вас из чата %2$s",youHaveBeenKicked:"Вас выбросили из чата %s",banActionLabel:"Запретить доступ",youHaveBeenBannedBy:"Пользователь %1$s запретил вам доступ в чат %2$s",youHaveBeenBanned:"Вам запретили доступ в чат %s",privateActionLabel:"Один-на-один чат",ignoreActionLabel:"Игнорировать",unignoreActionLabel:"Отменить игнорирование",setSubjectActionLabel:"Изменить топик",administratorMessageSubject:"Администратор",userJoinedRoom:"%s вошёл в чат.",userLeftRoom:"%s вышел из чата.",userHasBeenKickedFromRoom:"%s выброшен из чата.",userHasBeenBannedFromRoom:"%s запрещён доступ в чат.",presenceUnknownWarningSubject:"Уведомление:",presenceUnknownWarning:"Этот пользователь вероятнее всего оффлайн.",dateFormat:"mm.dd.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Модератор",tooltipIgnored:"Вы игнорируете этого пользователя.",tooltipEmoticons:"Смайлики",tooltipSound:"Озвучивать новое частное сообщение",tooltipAutoscroll:"Авто-прокручивание",tooltipStatusmessage:"Показывать статус сообщения",tooltipAdministration:"Администрирование чат комнаты",tooltipUsercount:"Участники чата",enterRoomPassword:'Чат комната "%s" защищена паролем.',enterRoomPasswordSubmit:"Войти в чат",passwordEnteredInvalid:'Неверный пароль для комнаты "%s".',nicknameConflict:"Это имя уже используется. Пожалуйста выберите другое имя.",errorMembersOnly:'Вы не можете войти в чат "%s": Недостаточно прав доступа.',errorMaxOccupantsReached:'Вы не можете войти в чат "%s": Слишком много участников.',antiSpamMessage:"Пожалуйста не рассылайте спам. Вас заблокировали на короткое время."},ca:{status:"Estat: %s",statusConnecting:"Connectant...",statusConnected:"Connectat",statusDisconnecting:"Desconnectant...",statusDisconnected:"Desconnectat",statusAuthfail:"Ha fallat la autenticació",roomSubject:"Assumpte:",messageSubmit:"Enviar",labelUsername:"Usuari:",labelPassword:"Clau:",loginSubmit:"Entrar",loginInvalid:"JID no vàlid",reason:"Raó:",subject:"Assumpte:",reasonWas:"La raó ha estat: %s.",kickActionLabel:"Expulsar",youHaveBeenKickedBy:"Has estat expulsat de %1$s per %2$s",youHaveBeenKicked:"Has estat expulsat de %s",banActionLabel:"Prohibir",youHaveBeenBannedBy:"Has estat expulsat permanentment de %1$s per %2$s",youHaveBeenBanned:"Has estat expulsat permanentment de %s",privateActionLabel:"Xat privat",ignoreActionLabel:"Ignorar",unignoreActionLabel:"No ignorar",setSubjectActionLabel:"Canviar assumpte",administratorMessageSubject:"Administrador",userJoinedRoom:"%s ha entrat a la sala.",userLeftRoom:"%s ha deixat la sala.",userHasBeenKickedFromRoom:"%s ha estat expulsat de la sala.",userHasBeenBannedFromRoom:"%s ha estat expulsat permanentment de la sala.",presenceUnknownWarningSubject:"Atenció:",presenceUnknownWarning:"Aquest usuari podria estar desconnectat ...",dateFormat:"dd.mm.yyyy",timeFormat:"HH:MM:ss",tooltipRole:"Moderador",tooltipIgnored:"Estàs ignorant aquest usuari",tooltipEmoticons:"Emoticones",tooltipSound:"Reproduir un so per a nous missatges",tooltipAutoscroll:"Desplaçament automàtic",tooltipStatusmessage:"Mostrar missatges d'estat",tooltipAdministration:"Administració de la sala",tooltipUsercount:"Usuaris dins la sala",enterRoomPassword:'La sala "%s" està protegida amb contrasenya.',enterRoomPasswordSubmit:"Entrar a la sala",passwordEnteredInvalid:'Contrasenya incorrecta per a la sala "%s".',nicknameConflict:"El nom d'usuari ja s'està utilitzant. Si us plau, escolleix-ne un altre.",errorMembersOnly:'No pots unir-te a la sala "%s": no tens prous privilegis.',errorMaxOccupantsReached:'No pots unir-te a la sala "%s": hi ha masses participants.',antiSpamMessage:"Si us plau, no facis spam. Has estat bloquejat temporalment."}}; + +//# sourceMappingURL=candy.min.map \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..f17bb3a --- /dev/null +++ b/index.html @@ -0,0 +1,69 @@ + + + + + IF XMPP chat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + diff --git a/libs.min.js b/libs.min.js new file mode 100644 index 0000000..6c12560 --- /dev/null +++ b/libs.min.js @@ -0,0 +1,3 @@ +function b64_sha1(a){return binb2b64(core_sha1(str2binb(a),8*a.length))}function str_sha1(a){return binb2str(core_sha1(str2binb(a),8*a.length))}function b64_hmac_sha1(a,b){return binb2b64(core_hmac_sha1(a,b))}function str_hmac_sha1(a,b){return binb2str(core_hmac_sha1(a,b))}function core_sha1(a,b){a[b>>5]|=128<<24-b%32,a[(b+64>>9<<4)+15]=b;var c,d,e,f,g,h,i,j,k=new Array(80),l=1732584193,m=-271733879,n=-1732584194,o=271733878,p=-1009589776;for(c=0;cd;d++)k[d]=16>d?a[c+d]:rol(k[d-3]^k[d-8]^k[d-14]^k[d-16],1),e=safe_add(safe_add(rol(l,5),sha1_ft(d,m,n,o)),safe_add(safe_add(p,k[d]),sha1_kt(d))),p=o,o=n,n=rol(m,30),m=l,l=e;l=safe_add(l,f),m=safe_add(m,g),n=safe_add(n,h),o=safe_add(o,i),p=safe_add(p,j)}return[l,m,n,o,p]}function sha1_ft(a,b,c,d){return 20>a?b&c|~b&d:40>a?b^c^d:60>a?b&c|b&d|c&d:b^c^d}function sha1_kt(a){return 20>a?1518500249:40>a?1859775393:60>a?-1894007588:-899497514}function core_hmac_sha1(a,b){var c=str2binb(a);c.length>16&&(c=core_sha1(c,8*a.length));for(var d=new Array(16),e=new Array(16),f=0;16>f;f++)d[f]=909522486^c[f],e[f]=1549556828^c[f];var g=core_sha1(d.concat(str2binb(b)),512+8*b.length);return core_sha1(e.concat(g),672)}function safe_add(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}function rol(a,b){return a<>>32-b}function str2binb(a){for(var b=[],c=255,d=0;d<8*a.length;d+=8)b[d>>5]|=(a.charCodeAt(d/8)&c)<<24-d%32;return b}function binb2str(a){for(var b="",c=255,d=0;d<32*a.length;d+=8)b+=String.fromCharCode(a[d>>5]>>>24-d%32&c);return b}function binb2b64(a){for(var b,c,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e="",f=0;f<4*a.length;f+=3)for(b=(a[f>>2]>>8*(3-f%4)&255)<<16|(a[f+1>>2]>>8*(3-(f+1)%4)&255)<<8|a[f+2>>2]>>8*(3-(f+2)%4)&255,c=0;4>c;c++)e+=8*f+6*c>32*a.length?"=":d.charAt(b>>6*(3-c)&63);return e}var Base64=function(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",b={encode:function(b){var c,d,e,f,g,h,i,j="",k=0;do c=b.charCodeAt(k++),d=b.charCodeAt(k++),e=b.charCodeAt(k++),f=c>>2,g=(3&c)<<4|d>>4,h=(15&d)<<2|e>>6,i=63&e,isNaN(d)?h=i=64:isNaN(e)&&(i=64),j=j+a.charAt(f)+a.charAt(g)+a.charAt(h)+a.charAt(i);while(k>4,d=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(c),64!=h&&(j+=String.fromCharCode(d)),64!=i&&(j+=String.fromCharCode(e));while(k>16)+(b>>16)+(c>>16);return d<<16|65535&c},b=function(a,b){return a<>>32-b},c=function(a){for(var b=[],c=0;c<8*a.length;c+=8)b[c>>5]|=(255&a.charCodeAt(c/8))<>5]>>>c%32&255);return b},e=function(a){for(var b="0123456789abcdef",c="",d=0;d<4*a.length;d++)c+=b.charAt(a[d>>2]>>d%4*8+4&15)+b.charAt(a[d>>2]>>d%4*8&15);return c},f=function(c,d,e,f,g,h){return a(b(a(a(d,c),a(f,h)),g),e)},g=function(a,b,c,d,e,g,h){return f(b&c|~b&d,a,b,e,g,h)},h=function(a,b,c,d,e,g,h){return f(b&d|c&~d,a,b,e,g,h)},i=function(a,b,c,d,e,g,h){return f(b^c^d,a,b,e,g,h)},j=function(a,b,c,d,e,g,h){return f(c^(b|~d),a,b,e,g,h)},k=function(b,c){b[c>>5]|=128<>>9<<4)+14]=c;for(var d,e,f,k,l=1732584193,m=-271733879,n=-1732584194,o=271733878,p=0;pc?Math.ceil(c):Math.floor(c),0>c&&(c+=b);b>c;c++)if(c in this&&this[c]===a)return c;return-1}),function(a){function b(a,b){return new f.Builder(a,b)}function c(a){return new f.Builder("message",a)}function d(a){return new f.Builder("iq",a)}function e(a){return new f.Builder("presence",a)}var f;f={VERSION:"02c798f",NS:{HTTPBIND:"http://jabber.org/protocol/httpbind",BOSH:"urn:xmpp:xbosh",CLIENT:"jabber:client",AUTH:"jabber:iq:auth",ROSTER:"jabber:iq:roster",PROFILE:"jabber:iq:profile",DISCO_INFO:"http://jabber.org/protocol/disco#info",DISCO_ITEMS:"http://jabber.org/protocol/disco#items",MUC:"http://jabber.org/protocol/muc",SASL:"urn:ietf:params:xml:ns:xmpp-sasl",STREAM:"http://etherx.jabber.org/streams",BIND:"urn:ietf:params:xml:ns:xmpp-bind",SESSION:"urn:ietf:params:xml:ns:xmpp-session",VERSION:"jabber:iq:version",STANZAS:"urn:ietf:params:xml:ns:xmpp-stanzas",XHTML_IM:"http://jabber.org/protocol/xhtml-im",XHTML:"http://www.w3.org/1999/xhtml"},XHTML:{tags:["a","blockquote","br","cite","em","img","li","ol","p","span","strong","ul","body"],attributes:{a:["href"],blockquote:["style"],br:[],cite:["style"],em:[],img:["src","alt","style","height","width"],li:["style"],ol:["style"],p:["style"],span:["style"],strong:[],ul:["style"],body:[]},css:["background-color","color","font-family","font-size","font-style","font-weight","margin-left","margin-right","text-align","text-decoration"],validTag:function(a){for(var b=0;b0)for(var c=0;c/g,">"),a=a.replace(/'/g,"'"),a=a.replace(/"/g,""")},xmlTextNode:function(a){return f.xmlGenerator().createTextNode(a)},xmlHtmlNode:function(a){var b;if(window.DOMParser){var c=new DOMParser;b=c.parseFromString(a,"text/xml")}else b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a);return b},getText:function(a){if(!a)return null;var b="";0===a.childNodes.length&&a.nodeType==f.ElementType.TEXT&&(b+=a.nodeValue);for(var c=0;c0&&(h=i.join("; "),c.setAttribute(g,h))}else c.setAttribute(g,h);for(b=0;b/g,"\\3e").replace(/@/g,"\\40")},unescapeNode:function(a){return a.replace(/\\20/g," ").replace(/\\22/g,'"').replace(/\\26/g,"&").replace(/\\27/g,"'").replace(/\\2f/g,"/").replace(/\\3a/g,":").replace(/\\3c/g,"<").replace(/\\3e/g,">").replace(/\\40/g,"@").replace(/\\5c/g,"\\")},getNodeFromJid:function(a){return a.indexOf("@")<0?null:a.split("@")[0]},getDomainFromJid:function(a){var b=f.getBareJidFromJid(a);if(b.indexOf("@")<0)return b;var c=b.split("@");return c.splice(0,1),c.join("@")},getResourceFromJid:function(a){var b=a.split("/");return b.length<2?null:(b.splice(0,1),b.join("/"))},getBareJidFromJid:function(a){return a?a.split("/")[0]:null},log:function(){},debug:function(a){this.log(this.LogLevel.DEBUG,a)},info:function(a){this.log(this.LogLevel.INFO,a)},warn:function(a){this.log(this.LogLevel.WARN,a)},error:function(a){this.log(this.LogLevel.ERROR,a)},fatal:function(a){this.log(this.LogLevel.FATAL,a)},serialize:function(a){var b;if(!a)return null;"function"==typeof a.tree&&(a=a.tree());var c,d,e=a.nodeName;for(a.getAttribute("_realname")&&(e=a.getAttribute("_realname")),b="<"+e,c=0;c/g,">").replace(/0){for(b+=">",c=0;c"}b+=""}else b+="/>";return b},_requestId:0,_connectionPlugins:{},addConnectionPlugin:function(a,b){f._connectionPlugins[a]=b}},f.Builder=function(a,b){("presence"==a||"message"==a||"iq"==a)&&(b&&!b.xmlns?b.xmlns=f.NS.CLIENT:b||(b={xmlns:f.NS.CLIENT})),this.nodeTree=f.xmlElement(a,b),this.node=this.nodeTree},f.Builder.prototype={tree:function(){return this.nodeTree},toString:function(){return f.serialize(this.nodeTree)},up:function(){return this.node=this.node.parentNode,this},attrs:function(a){for(var b in a)a.hasOwnProperty(b)&&this.node.setAttribute(b,a[b]);return this},c:function(a,b,c){var d=f.xmlElement(a,b,c);return this.node.appendChild(d),c||(this.node=d),this},cnode:function(a){var b,c=f.xmlGenerator();try{b=void 0!==c.importNode}catch(d){b=!1}var e=b?c.importNode(a,!0):f.copyElement(a);return this.node.appendChild(e),this.node=e,this},t:function(a){var b=f.xmlTextNode(a);return this.node.appendChild(b),this},h:function(a){var b=document.createElement("body");b.innerHTML=a;for(var c=f.createHtml(b);c.childNodes.length>0;)this.node.appendChild(c.childNodes[0]);return this}},f.Handler=function(a,b,c,d,e,g,h){this.handler=a,this.ns=b,this.name=c,this.type=d,this.id=e,this.options=h||{matchBare:!1},this.options.matchBare||(this.options.matchBare=!1),this.from=this.options.matchBare?g?f.getBareJidFromJid(g):null:g,this.user=!0},f.Handler.prototype={isMatch:function(a){var b,c=null;if(c=this.options.matchBare?f.getBareJidFromJid(a.getAttribute("from")):a.getAttribute("from"),b=!1,this.ns){var d=this;f.forEachChild(a,null,function(a){a.getAttribute("xmlns")==d.ns&&(b=!0)}),b=b||a.getAttribute("xmlns")==this.ns}else b=!0;return!b||this.name&&!f.isTagEqual(a,this.name)||this.type&&a.getAttribute("type")!=this.type||this.id&&a.getAttribute("id")!=this.id||this.from&&c!=this.from?!1:!0},run:function(a){var b=null;try{b=this.handler(a)}catch(c){throw c.sourceURL?f.fatal("error: "+this.handler+" "+c.sourceURL+":"+c.line+" - "+c.name+": "+c.message):c.fileName?("undefined"!=typeof console&&(console.trace(),console.error(this.handler," - error - ",c,c.message)),f.fatal("error: "+this.handler+" "+c.fileName+":"+c.lineNumber+" - "+c.name+": "+c.message)):f.fatal("error: "+c.message+"\n"+c.stack),c}return b},toString:function(){return"{Handler: "+this.handler+"("+this.name+","+this.id+","+this.ns+")}"}},f.TimedHandler=function(a,b){this.period=a,this.handler=b,this.lastCalled=(new Date).getTime(),this.user=!0},f.TimedHandler.prototype={run:function(){return this.lastCalled=(new Date).getTime(),this.handler()},reset:function(){this.lastCalled=(new Date).getTime()},toString:function(){return"{TimedHandler: "+this.handler+"("+this.period+")}"}},f.Connection=function(a,b){this.service=a,this.options=b||{};var c=this.options.protocol||"";this._proto=0===a.indexOf("ws:")||0===a.indexOf("wss:")||0===c.indexOf("ws")?new f.Websocket(this):new f.Bosh(this),this.jid="",this.domain=null,this.features=null,this._sasl_data={},this.do_session=!1,this.do_bind=!1,this.timedHandlers=[],this.handlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._authentication={},this._idleTimeout=null,this._disconnectTimeout=null,this.do_authentication=!0,this.authenticated=!1,this.disconnecting=!1,this.connected=!1,this.errors=0,this.paused=!1,this._data=[],this._uniqueId=0,this._sasl_success_handler=null,this._sasl_failure_handler=null,this._sasl_challenge_handler=null,this.maxRetries=5,this._idleTimeout=setTimeout(this._onIdle.bind(this),100);for(var d in f._connectionPlugins)if(f._connectionPlugins.hasOwnProperty(d)){var e=f._connectionPlugins[d],g=function(){};g.prototype=e,this[d]=new g,this[d].init(this)}},f.Connection.prototype={reset:function(){this._proto._reset(),this.do_session=!1,this.do_bind=!1,this.timedHandlers=[],this.handlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._authentication={},this.authenticated=!1,this.disconnecting=!1,this.connected=!1,this.errors=0,this._requests=[],this._uniqueId=0},pause:function(){this.paused=!0},resume:function(){this.paused=!1},getUniqueId:function(a){return"string"==typeof a||"number"==typeof a?++this._uniqueId+":"+a:++this._uniqueId+""},connect:function(a,b,c,d,e,g){this.jid=a,this.authzid=f.getBareJidFromJid(this.jid),this.authcid=f.getNodeFromJid(this.jid),this.pass=b,this.servtype="xmpp",this.connect_callback=c,this.disconnecting=!1,this.connected=!1,this.authenticated=!1,this.errors=0,this.domain=f.getDomainFromJid(this.jid),this._changeConnectStatus(f.Status.CONNECTING,null),this._proto._connect(d,e,g)},attach:function(a,b,c,d,e,f,g){this._proto._attach(a,b,c,d,e,f,g)},xmlInput:function(){},xmlOutput:function(){},rawInput:function(){},rawOutput:function(){},send:function(a){if(null!==a){if("function"==typeof a.sort)for(var b=0;b0;)e=this.removeHandlers.pop(),d=this.handlers.indexOf(e),d>=0&&this.handlers.splice(d,1);for(;this.addHandlers.length>0;)this.handlers.push(this.addHandlers.pop());if(this.disconnecting&&this._proto._emptyQueue())return void this._doDisconnect();var g,h,i=c.getAttribute("type");if(null!==i&&"terminate"==i){if(this.disconnecting)return;return g=c.getAttribute("condition"),h=c.getElementsByTagName("conflict"),null!==g?("remote-stream-error"==g&&h.length>0&&(g="conflict"),this._changeConnectStatus(f.Status.CONNFAIL,g)):this._changeConnectStatus(f.Status.CONNFAIL,"unknown"),void this.disconnect("unknown stream-error")}var j=this;f.forEachChild(c,null,function(a){var b,c;for(c=j.handlers,j.handlers=[],b=0;b0;g||(g=d.getElementsByTagName("features").length>0);var h,i,j=d.getElementsByTagName("mechanism"),k=[],l=!1;if(!g)return void this._proto._no_auth_received(b);if(j.length>0)for(h=0;h0,(l=this._authentication.legacy_auth||k.length>0)?void(this.do_authentication!==!1&&this.authenticate(k)):void this._proto._no_auth_received(b)}}},authenticate:function(a){var c;for(c=0;ca[e].prototype.priority&&(e=g);if(e!=c){var h=a[c];a[c]=a[e],a[e]=h}}var i=!1;for(c=0;c0&&(b="conflict"),this._changeConnectStatus(f.Status.AUTHFAIL,b),!1}var e,g=a.getElementsByTagName("bind");return g.length>0?(e=g[0].getElementsByTagName("jid"),void(e.length>0&&(this.jid=f.getText(e[0]),this.do_session?(this._addSysHandler(this._sasl_session_cb.bind(this),null,null,null,"_session_auth_2"),this.send(d({type:"set",id:"_session_auth_2"}).c("session",{xmlns:f.NS.SESSION}).tree())):(this.authenticated=!0,this._changeConnectStatus(f.Status.CONNECTED,null))))):(f.info("SASL binding failed."),this._changeConnectStatus(f.Status.AUTHFAIL,null),!1)},_sasl_session_cb:function(a){if("result"==a.getAttribute("type"))this.authenticated=!0,this._changeConnectStatus(f.Status.CONNECTED,null);else if("error"==a.getAttribute("type"))return f.info("Session creation failed."),this._changeConnectStatus(f.Status.AUTHFAIL,null),!1;return!1},_sasl_failure_cb:function(){return this._sasl_success_handler&&(this.deleteHandler(this._sasl_success_handler),this._sasl_success_handler=null),this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null),this._sasl_mechanism&&this._sasl_mechanism.onFailure(),this._changeConnectStatus(f.Status.AUTHFAIL,null),!1},_auth2_cb:function(a){return"result"==a.getAttribute("type")?(this.authenticated=!0,this._changeConnectStatus(f.Status.CONNECTED,null)):"error"==a.getAttribute("type")&&(this._changeConnectStatus(f.Status.AUTHFAIL,null),this.disconnect("authentication failed")),!1},_addSysTimedHandler:function(a,b){var c=new f.TimedHandler(a,b);return c.user=!1,this.addTimeds.push(c),c},_addSysHandler:function(a,b,c,d,e){var g=new f.Handler(a,b,c,d,e);return g.user=!1,this.addHandlers.push(g),g},_onDisconnectTimeout:function(){return f.info("_onDisconnectTimeout was called"),this._proto._onDisconnectTimeout(),this._doDisconnect(),!1},_onIdle:function(){for(var a,b,c,d;this.addTimeds.length>0;)this.timedHandlers.push(this.addTimeds.pop());for(;this.removeTimeds.length>0;)b=this.removeTimeds.pop(),a=this.timedHandlers.indexOf(b),a>=0&&this.timedHandlers.splice(a,1);var e=(new Date).getTime();for(d=[],a=0;a=c-e?b.run()&&d.push(b):d.push(b));this.timedHandlers=d,clearTimeout(this._idleTimeout),this._proto._onIdle(),this.connected&&(this._idleTimeout=setTimeout(this._onIdle.bind(this),100))}},a&&a(f,b,c,d,e),f.SASLMechanism=function(a,b,c){this.name=a,this.isClientFirst=b,this.priority=c},f.SASLMechanism.prototype={test:function(){return!0},onStart:function(a){this._connection=a},onChallenge:function(){throw new Error("You should implement challenge handling!")},onFailure:function(){this._connection=null},onSuccess:function(){this._connection=null}},f.SASLAnonymous=function(){},f.SASLAnonymous.prototype=new f.SASLMechanism("ANONYMOUS",!1,10),f.SASLAnonymous.test=function(a){return null===a.authcid},f.Connection.prototype.mechanisms[f.SASLAnonymous.prototype.name]=f.SASLAnonymous,f.SASLPlain=function(){},f.SASLPlain.prototype=new f.SASLMechanism("PLAIN",!0,20),f.SASLPlain.test=function(a){return null!==a.authcid},f.SASLPlain.prototype.onChallenge=function(a){var b=a.authzid;return b+="\x00",b+=a.authcid,b+="\x00",b+=a.pass},f.Connection.prototype.mechanisms[f.SASLPlain.prototype.name]=f.SASLPlain,f.SASLSHA1=function(){},f.SASLSHA1.prototype=new f.SASLMechanism("SCRAM-SHA-1",!0,40),f.SASLSHA1.test=function(a){return null!==a.authcid},f.SASLSHA1.prototype.onChallenge=function(a,b,c){var d=c||MD5.hexdigest(1234567890*Math.random()),e="n="+a.authcid;return e+=",r=",e+=d,a._sasl_data.cnonce=d,a._sasl_data["client-first-message-bare"]=e,e="n,,"+e,this.onChallenge=function(a,b){for(var c,d,e,f,g,h,i,j,k,l,m,n="c=biws,",o=a._sasl_data["client-first-message-bare"]+","+b+",",p=a._sasl_data.cnonce,q=/([a-z]+)=([^,]+)(,|$)/;b.match(q);){var r=b.match(q);switch(b=b.replace(r[0],""),r[1]){case"r":c=r[2];break;case"s":d=r[2];break;case"i":e=r[2]}}if(c.substr(0,p.length)!==p)return a._sasl_data={},a._sasl_failure_cb();for(n+="r="+c,o+=n,d=Base64.decode(d),d+="\x00\x00\x00",f=h=core_hmac_sha1(a.pass,d),i=1;e>i;i++){for(g=core_hmac_sha1(a.pass,binb2str(h)),j=0;5>j;j++)f[j]^=g[j];h=g}for(f=binb2str(f),k=core_hmac_sha1(f,"Client Key"),l=str_hmac_sha1(f,"Server Key"),m=core_hmac_sha1(str_sha1(binb2str(k)),o),a._sasl_data["server-signature"]=b64_hmac_sha1(l,o),j=0;5>j;j++)k[j]^=m[j];return n+=",p="+Base64.encode(binb2str(k))}.bind(this),e},f.Connection.prototype.mechanisms[f.SASLSHA1.prototype.name]=f.SASLSHA1,f.SASLMD5=function(){},f.SASLMD5.prototype=new f.SASLMechanism("DIGEST-MD5",!1,30),f.SASLMD5.test=function(a){return null!==a.authcid},f.SASLMD5.prototype._quote=function(a){return'"'+a.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'},f.SASLMD5.prototype.onChallenge=function(a,b,c){for(var d,e=/([a-z]+)=("[^"]+"|[^,"]+)(?:,|$)/,f=c||MD5.hexdigest(""+1234567890*Math.random()),g="",h=null,i="",j="";b.match(e);)switch(d=b.match(e),b=b.replace(d[0],""),d[2]=d[2].replace(/^"(.+)"$/,"$1"),d[1]){case"realm":g=d[2]; +break;case"nonce":i=d[2];break;case"qop":j=d[2];break;case"host":h=d[2]}var k=a.servtype+"/"+a.domain;null!==h&&(k=k+"/"+h);var l=MD5.hash(a.authcid+":"+g+":"+this._connection.pass)+":"+i+":"+f,m="AUTHENTICATE:"+k,n="";return n+="charset=utf-8,",n+="username="+this._quote(a.authcid)+",",n+="realm="+this._quote(g)+",",n+="nonce="+this._quote(i)+",",n+="nc=00000001,",n+="cnonce="+this._quote(f)+",",n+="digest-uri="+this._quote(k)+",",n+="response="+MD5.hexdigest(MD5.hexdigest(l)+":"+i+":00000001:"+f+":auth:"+MD5.hexdigest(m))+",",n+="qop=auth",this.onChallenge=function(){return""}.bind(this),n},f.Connection.prototype.mechanisms[f.SASLMD5.prototype.name]=f.SASLMD5}(function(){window.Strophe=arguments[0],window.$build=arguments[1],window.$msg=arguments[2],window.$iq=arguments[3],window.$pres=arguments[4]}),Strophe.Request=function(a,b,c,d){this.id=++Strophe._requestId,this.xmlData=a,this.data=Strophe.serialize(a),this.origFunc=b,this.func=b,this.rid=c,this.date=0/0,this.sends=d||0,this.abort=!1,this.dead=null,this.age=function(){if(!this.date)return 0;var a=new Date;return(a-this.date)/1e3},this.timeDead=function(){if(!this.dead)return 0;var a=new Date;return(a-this.dead)/1e3},this.xhr=this._newXHR()},Strophe.Request.prototype={getResponse:function(){var a=null;if(this.xhr.responseXML&&this.xhr.responseXML.documentElement){if(a=this.xhr.responseXML.documentElement,"parsererror"==a.tagName)throw Strophe.error("invalid response received"),Strophe.error("responseText: "+this.xhr.responseText),Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML)),"parsererror"}else this.xhr.responseText&&(Strophe.error("invalid response received"),Strophe.error("responseText: "+this.xhr.responseText),Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML)));return a},_newXHR:function(){var a=null;return window.XMLHttpRequest?(a=new XMLHttpRequest,a.overrideMimeType&&a.overrideMimeType("text/xml")):window.ActiveXObject&&(a=new ActiveXObject("Microsoft.XMLHTTP")),a.onreadystatechange=this.func.bind(null,this),a}},Strophe.Bosh=function(a){this._conn=a,this.rid=Math.floor(4294967295*Math.random()),this.sid=null,this.hold=1,this.wait=60,this.window=5,this._requests=[]},Strophe.Bosh.prototype={strip:null,_buildBody:function(){var a=$build("body",{rid:this.rid++,xmlns:Strophe.NS.HTTPBIND});return null!==this.sid&&a.attrs({sid:this.sid}),a},_reset:function(){this.rid=Math.floor(4294967295*Math.random()),this.sid=null},_connect:function(a,b,c){this.wait=a||this.wait,this.hold=b||this.hold;var d=this._buildBody().attrs({to:this._conn.domain,"xml:lang":"en",wait:this.wait,hold:this.hold,content:"text/xml; charset=utf-8",ver:"1.6","xmpp:version":"1.0","xmlns:xmpp":Strophe.NS.BOSH});c&&d.attrs({route:c});var e=this._conn._connect_cb;this._requests.push(new Strophe.Request(d.tree(),this._onRequestStateChange.bind(this,e.bind(this._conn)),d.tree().getAttribute("rid"))),this._throttledRequestHandler()},_attach:function(a,b,c,d,e,f,g){this._conn.jid=a,this.sid=b,this.rid=c,this._conn.connect_callback=d,this._conn.domain=Strophe.getDomainFromJid(this._conn.jid),this._conn.authenticated=!0,this._conn.connected=!0,this.wait=e||this.wait,this.hold=f||this.hold,this.window=g||this.window,this._conn._changeConnectStatus(Strophe.Status.ATTACHED,null)},_connect_cb:function(a){var b,c,d=a.getAttribute("type");if(null!==d&&"terminate"==d)return Strophe.error("BOSH-Connection failed: "+b),b=a.getAttribute("condition"),c=a.getElementsByTagName("conflict"),null!==b?("remote-stream-error"==b&&c.length>0&&(b="conflict"),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,b)):this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"unknown"),this._conn._doDisconnect(),Strophe.Status.CONNFAIL;this.sid||(this.sid=a.getAttribute("sid"));var e=a.getAttribute("requests");e&&(this.window=parseInt(e,10));var f=a.getAttribute("hold");f&&(this.hold=parseInt(f,10));var g=a.getAttribute("wait");g&&(this.wait=parseInt(g,10))},_disconnect:function(a){this._sendTerminate(a)},_doDisconnect:function(){this.sid=null,this.rid=Math.floor(4294967295*Math.random())},_emptyQueue:function(){return 0===this._requests.length},_hitError:function(a){this.errors++,Strophe.warn("request errored, status: "+a+", number of errors: "+this.errors),this.errors>4&&this._onDisconnectTimeout()},_no_auth_received:function(a){a=a?a.bind(this._conn):this._conn._connect_cb.bind(this._conn);var b=this._buildBody();this._requests.push(new Strophe.Request(b.tree(),this._onRequestStateChange.bind(this,a.bind(this._conn)),b.tree().getAttribute("rid"))),this._throttledRequestHandler()},_onDisconnectTimeout:function(){for(var a;this._requests.length>0;)a=this._requests.pop(),a.abort=!0,a.xhr.abort(),a.xhr.onreadystatechange=function(){}},_onIdle:function(){var a=this._conn._data;if(this._conn.authenticated&&0===this._requests.length&&0===a.length&&!this._conn.disconnecting&&(Strophe.info("no requests during idle cycle, sending blank request"),a.push(null)),this._requests.length<2&&a.length>0&&!this._conn.paused){for(var b=this._buildBody(),c=0;c0){var d=this._requests[0].age();null!==this._requests[0].dead&&this._requests[0].timeDead()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait)&&this._throttledRequestHandler(),d>Math.floor(Strophe.TIMEOUT*this.wait)&&(Strophe.warn("Request "+this._requests[0].id+" timed out, over "+Math.floor(Strophe.TIMEOUT*this.wait)+" seconds since last activity"),this._throttledRequestHandler())}},_onRequestStateChange:function(a,b){if(Strophe.debug("request id "+b.id+"."+b.sends+" state changed to "+b.xhr.readyState),b.abort)return void(b.abort=!1);var c;if(4==b.xhr.readyState){c=0;try{c=b.xhr.status}catch(d){}if("undefined"==typeof c&&(c=0),this.disconnecting&&c>=400)return void this._hitError(c);var e=this._requests[0]==b,f=this._requests[1]==b;(c>0&&500>c||b.sends>5)&&(this._removeRequest(b),Strophe.debug("request id "+b.id+" should now be removed")),200==c?((f||e&&this._requests.length>0&&this._requests[0].age()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait))&&this._restartRequest(0),Strophe.debug("request id "+b.id+"."+b.sends+" got 200"),a(b),this.errors=0):(Strophe.error("request id "+b.id+"."+b.sends+" error "+c+" happened"),(0===c||c>=400&&600>c||c>=12e3)&&(this._hitError(c),c>=400&&500>c&&(this._conn._changeConnectStatus(Strophe.Status.DISCONNECTING,null),this._conn._doDisconnect()))),c>0&&500>c||b.sends>5||this._throttledRequestHandler()}},_processRequest:function(a){var b=this,c=this._requests[a],d=-1;try{4==c.xhr.readyState&&(d=c.xhr.status)}catch(e){Strophe.error("caught an error in _requests["+a+"], reqStatus: "+d)}if("undefined"==typeof d&&(d=-1),c.sends>this.maxRetries)return void this._onDisconnectTimeout();var f=c.age(),g=!isNaN(f)&&f>Math.floor(Strophe.TIMEOUT*this.wait),h=null!==c.dead&&c.timeDead()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait),i=4==c.xhr.readyState&&(1>d||d>=500);if((g||h||i)&&(h&&Strophe.error("Request "+this._requests[a].id+" timed out (secondary), restarting"),c.abort=!0,c.xhr.abort(),c.xhr.onreadystatechange=function(){},this._requests[a]=new Strophe.Request(c.xmlData,c.origFunc,c.rid,c.sends),c=this._requests[a]),0===c.xhr.readyState){Strophe.debug("request id "+c.id+"."+c.sends+" posting");try{c.xhr.open("POST",this._conn.service,this._conn.options.sync?!1:!0)}catch(j){return Strophe.error("XHR open failed."),this._conn.connected||this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"bad-service"),void this._conn.disconnect()}var k=function(){if(c.date=new Date,b._conn.options.customHeaders){var a=b._conn.options.customHeaders;for(var d in a)a.hasOwnProperty(d)&&c.xhr.setRequestHeader(d,a[d])}c.xhr.send(c.data)};if(c.sends>1){var l=1e3*Math.min(Math.floor(Strophe.TIMEOUT*this.wait),Math.pow(c.sends,3));setTimeout(k,l)}else k();c.sends++,this._conn.xmlOutput!==Strophe.Connection.prototype.xmlOutput&&this._conn.xmlOutput(c.xmlData.nodeName===this.strip&&c.xmlData.childNodes.length?c.xmlData.childNodes[0]:c.xmlData),this._conn.rawOutput!==Strophe.Connection.prototype.rawOutput&&this._conn.rawOutput(c.data)}else Strophe.debug("_processRequest: "+(0===a?"first":"second")+" request has readyState of "+c.xhr.readyState)},_removeRequest:function(a){Strophe.debug("removing request");var b;for(b=this._requests.length-1;b>=0;b--)a==this._requests[b]&&this._requests.splice(b,1);a.xhr.onreadystatechange=function(){},this._throttledRequestHandler()},_restartRequest:function(a){var b=this._requests[a];null===b.dead&&(b.dead=new Date),this._processRequest(a)},_reqToData:function(a){try{return a.getResponse()}catch(b){if("parsererror"!=b)throw b;this._conn.disconnect("strophe-parsererror")}},_sendTerminate:function(a){Strophe.info("_sendTerminate was called");var b=this._buildBody().attrs({type:"terminate"});a&&b.cnode(a.tree());var c=new Strophe.Request(b.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),b.tree().getAttribute("rid"));this._requests.push(c),this._throttledRequestHandler()},_send:function(){clearTimeout(this._conn._idleTimeout),this._throttledRequestHandler(),this._conn._idleTimeout=setTimeout(this._conn._onIdle.bind(this._conn),100)},_sendRestart:function(){this._throttledRequestHandler(),clearTimeout(this._conn._idleTimeout)},_throttledRequestHandler:function(){Strophe.debug(this._requests?"_throttledRequestHandler called with "+this._requests.length+" requests":"_throttledRequestHandler called with undefined requests"),this._requests&&0!==this._requests.length&&(this._requests.length>0&&this._processRequest(0),this._requests.length>1&&Math.abs(this._requests[0].rid-this._requests[1].rid)\s*)*/,"");if(""===b)return;b=a.data.replace(//,"");var c=(new DOMParser).parseFromString(b,"text/xml").documentElement;this._conn.xmlInput(c),this._conn.rawInput(a.data),this._handleStreamStart(c)&&(this._connect_cb(c),this.streamStart=a.data.replace(/^$/,""))}else{if(""===a.data)return this._conn.rawInput(a.data),this._conn.xmlInput(document.createElement("stream:stream")),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"Received closing stream"),void this._conn._doDisconnect();var d=this._streamWrap(a.data),e=(new DOMParser).parseFromString(d,"text/xml").documentElement;this.socket.onmessage=this._onMessage.bind(this),this._conn._connect_cb(e,null,a.data)}},_disconnect:function(a){if(this.socket.readyState!==WebSocket.CLOSED){a&&this._conn.send(a);var b="";this._conn.xmlOutput(document.createElement("stream:stream")),this._conn.rawOutput(b);try{this.socket.send(b)}catch(c){Strophe.info("Couldn't send closing stream tag.")}}this._conn._doDisconnect()},_doDisconnect:function(){Strophe.info("WebSockets _doDisconnect was called"),this._closeSocket()},_streamWrap:function(a){return this.streamStart+a+""},_closeSocket:function(){if(this.socket)try{this.socket.close()}catch(a){}this.socket=null},_emptyQueue:function(){return!0},_onClose:function(){this._conn.connected&&!this._conn.disconnecting?(Strophe.error("Websocket closed unexcectedly"),this._conn._doDisconnect()):Strophe.info("Websocket closed")},_no_auth_received:function(a){Strophe.error("Server did not send any auth methods"),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"Server did not send any auth methods"),a&&(a=a.bind(this._conn))(),this._conn._doDisconnect()},_onDisconnectTimeout:function(){},_onError:function(a){Strophe.error("Websocket error "+a),this._conn._changeConnectStatus(Strophe.Status.CONNFAIL,"The WebSocket connection could not be established was disconnected."),this._disconnect()},_onIdle:function(){var a=this._conn._data;if(a.length>0&&!this._conn.paused){for(var b=0;b"===a.data){var d="";return this._conn.rawInput(d),this._conn.xmlInput(document.createElement("stream:stream")),void(this._conn.disconnecting||this._conn._doDisconnect())}if(0===a.data.search("/,""),b=(new DOMParser).parseFromString(c,"text/xml").documentElement,!this._handleStreamStart(b))return}else c=this._streamWrap(a.data),b=(new DOMParser).parseFromString(c,"text/xml").documentElement;if(!this._check_streamerror(b,Strophe.Status.ERROR))return this._conn.disconnecting&&"presence"===b.firstChild.nodeName&&"unavailable"===b.firstChild.getAttribute("type")?(this._conn.xmlInput(b),void this._conn.rawInput(Strophe.serialize(b))):void this._conn._dataRecv(b,a.data)},_onOpen:function(){Strophe.info("Websocket open");var a=this._buildStream();this._conn.xmlOutput(a.tree());var b=this._removeClosingTag(a);this._conn.rawOutput(b),this.socket.send(b)},_removeClosingTag:function(a){var b=Strophe.serialize(a);return b=b.replace(/<(stream:stream .*[^\/])\/>$/,"<$1>")},_reqToData:function(a){return a},_send:function(){this._conn.flush()},_sendRestart:function(){clearTimeout(this._conn._idleTimeout),this._conn._onIdle.bind(this._conn)()}},function(){var a,b,c,d=function(a,b){return function(){return a.apply(b,arguments)}};Strophe.addConnectionPlugin("muc",{_connection:null,rooms:{},roomNames:[],init:function(a){return this._connection=a,this._muc_handler=null,Strophe.addNamespace("MUC_OWNER",Strophe.NS.MUC+"#owner"),Strophe.addNamespace("MUC_ADMIN",Strophe.NS.MUC+"#admin"),Strophe.addNamespace("MUC_USER",Strophe.NS.MUC+"#user"),Strophe.addNamespace("MUC_ROOMCONF",Strophe.NS.MUC+"#roomconfig")},join:function(a,b,d,e,f,g,h){var i,j;return j=this.test_append_nick(a,b),i=$pres({from:this._connection.jid,to:j}).c("x",{xmlns:Strophe.NS.MUC}),null!=h&&(i=i.c("history",h).up),null!=g&&i.cnode(Strophe.xmlElement("password",[],g)),"undefined"!=typeof extended_presence&&null!==extended_presence&&i.up.cnode(extended_presence),null==this._muc_handler&&(this._muc_handler=this._connection.addHandler(function(b){return function(c){var d,e,f,g,h,i,j,k,l,m;if(d=c.getAttribute("from"),!d)return!0;if(h=d.split("/")[0],!b.rooms[h])return!0;if(a=b.rooms[h],f={},"message"===c.nodeName)f=a._message_handlers;else if("presence"===c.nodeName&&(k=c.getElementsByTagName("x"),k.length>0))for(l=0,m=k.length;m>l;l++)if(i=k[l],j=i.getAttribute("xmlns"),j&&j.match(Strophe.NS.MUC)){f=a._presence_handlers;break}for(g in f)e=f[g],e(c,a)||delete f[g];return!0}}(this))),this.rooms.hasOwnProperty(a)||(this.rooms[a]=new c(this,a,b,g),this.roomNames.push(a)),e&&this.rooms[a].addHandler("presence",e),d&&this.rooms[a].addHandler("message",d),f&&this.rooms[a].addHandler("roster",f),this._connection.send(i)},leave:function(a,b,c,d){var e,f,g,h;return e=this.roomNames.indexOf(a),delete this.rooms[a],e>=0&&(this.roomNames.splice(e,1),0===this.roomNames.length&&(this._connection.deleteHandler(this._muc_handler),this._muc_handler=null)),h=this.test_append_nick(a,b),g=this._connection.getUniqueId(),f=$pres({type:"unavailable",id:g,from:this._connection.jid,to:h}),null!=d&&f.c("status",d),null!=c&&this._connection.addHandler(c,null,"presence",null,g),this._connection.send(f),g},message:function(a,b,c,d,e){var f,g,h,i;return i=this.test_append_nick(a,b),e=e||(null!=b?"chat":"groupchat"),g=this._connection.getUniqueId(),f=$msg({to:i,from:this._connection.jid,type:e,id:g}).c("body",{xmlns:Strophe.NS.CLIENT}).t(c),f.up(),null!=d&&(f.c("html",{xmlns:Strophe.NS.XHTML_IM}).c("body",{xmlns:Strophe.NS.XHTML}).h(d),0===f.node.childNodes.length?(h=f.node.parentNode,f.up().up(),f.node.removeChild(h)):f.up().up()),f.c("x",{xmlns:"jabber:x:event"}).c("composing"),this._connection.send(f),g},groupchat:function(a,b,c){return this.message(a,null,b,c)},invite:function(a,b,c){var d,e;return e=this._connection.getUniqueId(),d=$msg({from:this._connection.jid,to:a,id:e}).c("x",{xmlns:Strophe.NS.MUC_USER}).c("invite",{to:b}),null!=c&&d.c("reason",c),this._connection.send(d),e},directInvite:function(a,b,c,d){var e,f,g;return g=this._connection.getUniqueId(),e={xmlns:"jabber:x:conference",jid:a},null!=c&&(e.reason=c),null!=d&&(e.password=d),f=$msg({from:this._connection.jid,to:b,id:g}).c("x",e),this._connection.send(f),g},queryOccupants:function(a,b,c){var d,e;return d={xmlns:Strophe.NS.DISCO_ITEMS},e=$iq({from:this._connection.jid,to:a,type:"get"}).c("query",d),this._connection.sendIQ(e,b,c)},configure:function(a,b,c){var d,e;return d=$iq({to:a,type:"get"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}),e=d.tree(),this._connection.sendIQ(e,b,c)},cancelConfigure:function(a){var b,c;return b=$iq({to:a,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}).c("x",{xmlns:"jabber:x:data",type:"cancel"}),c=b.tree(),this._connection.sendIQ(c)},saveConfiguration:function(a,b,c,d){var e,f,g,h,i;if(f=$iq({to:a,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}),"undefined"!=typeof Form&&b instanceof Form)b.type="submit",f.cnode(b.toXML());else for(f.c("x",{xmlns:"jabber:x:data",type:"submit"}),h=0,i=b.length;i>h;h++)e=b[h],f.cnode(e).up();return g=f.tree(),this._connection.sendIQ(g,c,d)},createInstantRoom:function(a,b,c){var d;return d=$iq({to:a,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_OWNER}).c("x",{xmlns:"jabber:x:data",type:"submit"}),this._connection.sendIQ(d.tree(),b,c)},setTopic:function(a,b){var c;return c=$msg({to:a,from:this._connection.jid,type:"groupchat"}).c("subject",{xmlns:"jabber:client"}).t(b),this._connection.send(c.tree())},_modifyPrivilege:function(a,b,c,d,e){var f;return f=$iq({to:a,type:"set"}).c("query",{xmlns:Strophe.NS.MUC_ADMIN}).cnode(b.node),null!=c&&f.c("reason",c),this._connection.sendIQ(f.tree(),d,e)},modifyRole:function(a,b,c,d,e,f){var g;return g=$build("item",{nick:b,role:c}),this._modifyPrivilege(a,g,d,e,f)},kick:function(a,b,c,d,e){return this.modifyRole(a,b,"none",c,d,e)},voice:function(a,b,c,d,e){return this.modifyRole(a,b,"participant",c,d,e)},mute:function(a,b,c,d,e){return this.modifyRole(a,b,"visitor",c,d,e)},op:function(a,b,c,d,e){return this.modifyRole(a,b,"moderator",c,d,e)},deop:function(a,b,c,d,e){return this.modifyRole(a,b,"participant",c,d,e)},modifyAffiliation:function(a,b,c,d,e,f){var g;return g=$build("item",{jid:b,affiliation:c}),this._modifyPrivilege(a,g,d,e,f)},ban:function(a,b,c,d,e){return this.modifyAffiliation(a,b,"outcast",c,d,e)},member:function(a,b,c,d,e){return this.modifyAffiliation(a,b,"member",c,d,e)},revoke:function(a,b,c,d,e){return this.modifyAffiliation(a,b,"none",c,d,e)},owner:function(a,b,c,d,e){return this.modifyAffiliation(a,b,"owner",c,d,e)},admin:function(a,b,c,d,e){return this.modifyAffiliation(a,b,"admin",c,d,e)},changeNick:function(a,b){var c,d;return d=this.test_append_nick(a,b),c=$pres({from:this._connection.jid,to:d,id:this._connection.getUniqueId()}),this._connection.send(c.tree())},setStatus:function(a,b,c,d){var e,f;return f=this.test_append_nick(a,b),e=$pres({from:this._connection.jid,to:f}),null!=c&&e.c("show",c).up(),null!=d&&e.c("status",d),this._connection.send(e.tree())},listRooms:function(a,b,c){var d;return d=$iq({to:a,from:this._connection.jid,type:"get"}).c("query",{xmlns:Strophe.NS.DISCO_ITEMS}),this._connection.sendIQ(d,b,c)},test_append_nick:function(a,b){var c,d;return d=Strophe.escapeNode(Strophe.getNodeFromJid(a)),c=Strophe.getDomainFromJid(a),d+"@"+c+(null!=b?"/"+b:"")}}),c=function(){function b(a,b,c,e){this.client=a,this.name=b,this.nick=c,this.password=e,this._roomRosterHandler=d(this._roomRosterHandler,this),this._addOccupant=d(this._addOccupant,this),this.roster={},this._message_handlers={},this._presence_handlers={},this._roster_handlers={},this._handler_ids=0,a.muc&&(this.client=a.muc),this.name=Strophe.getBareJidFromJid(b),this.addHandler("presence",this._roomRosterHandler)}return b.prototype.join=function(a,b,c){return this.client.join(this.name,this.nick,a,b,c,this.password)},b.prototype.leave=function(a,b){return this.client.leave(this.name,this.nick,a,b),delete this.client.rooms[this.name]},b.prototype.message=function(a,b,c,d){return this.client.message(this.name,a,b,c,d)},b.prototype.groupchat=function(a,b){return this.client.groupchat(this.name,a,b)},b.prototype.invite=function(a,b){return this.client.invite(this.name,a,b)},b.prototype.directInvite=function(a,b){return this.client.directInvite(this.name,a,b,this.password)},b.prototype.configure=function(a){return this.client.configure(this.name,a)},b.prototype.cancelConfigure=function(){return this.client.cancelConfigure(this.name)},b.prototype.saveConfiguration=function(a){return this.client.saveConfiguration(this.name,a)},b.prototype.queryOccupants=function(a,b){return this.client.queryOccupants(this.name,a,b)},b.prototype.setTopic=function(a){return this.client.setTopic(this.name,a)},b.prototype.modifyRole=function(a,b,c,d,e){return this.client.modifyRole(this.name,a,b,c,d,e)},b.prototype.kick=function(a,b,c,d){return this.client.kick(this.name,a,b,c,d)},b.prototype.voice=function(a,b,c,d){return this.client.voice(this.name,a,b,c,d)},b.prototype.mute=function(a,b,c,d){return this.client.mute(this.name,a,b,c,d)},b.prototype.op=function(a,b,c,d){return this.client.op(this.name,a,b,c,d)},b.prototype.deop=function(a,b,c,d){return this.client.deop(this.name,a,b,c,d)},b.prototype.modifyAffiliation=function(a,b,c,d,e){return this.client.modifyAffiliation(this.name,a,b,c,d,e)},b.prototype.ban=function(a,b,c,d){return this.client.ban(this.name,a,b,c,d)},b.prototype.member=function(a,b,c,d){return this.client.member(this.name,a,b,c,d)},b.prototype.revoke=function(a,b,c,d){return this.client.revoke(this.name,a,b,c,d)},b.prototype.owner=function(a,b,c,d){return this.client.owner(this.name,a,b,c,d)},b.prototype.admin=function(a,b,c,d){return this.client.admin(this.name,a,b,c,d)},b.prototype.changeNick=function(a){return this.nick=a,this.client.changeNick(this.name,a)},b.prototype.setStatus=function(a,b){return this.client.setStatus(this.name,this.nick,a,b)},b.prototype.addHandler=function(a,b){var c;switch(c=this._handler_ids++,a){case"presence":this._presence_handlers[c]=b;break;case"message":this._message_handlers[c]=b;break;case"roster":this._roster_handlers[c]=b;break;default:return this._handler_ids--,null}return c},b.prototype.removeHandler=function(a){return delete this._presence_handlers[a],delete this._message_handlers[a],delete this._roster_handlers[a]},b.prototype._addOccupant=function(b){var c;return c=new a(b,this),this.roster[c.nick]=c,c},b.prototype._roomRosterHandler=function(a){var c,d,e,f,g,h;switch(c=b._parsePresence(a),g=c.nick,f=c.newnick||null,c.type){case"error":return;case"unavailable":f&&(c.nick=f,this.roster[g]&&this.roster[f]&&(this.roster[g].update(this.roster[f]),this.roster[f]=this.roster[g]),this.roster[g]&&!this.roster[f]&&(this.roster[f]=this.roster[g].update(c))),delete this.roster[g];break;default:this.roster[g]?this.roster[g].update(c):this._addOccupant(c)}h=this._roster_handlers;for(e in h)d=h[e],d(this.roster,this)||delete this._roster_handlers[e];return!0},b._parsePresence=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;for(e={},b=a.attributes,e.nick=Strophe.getResourceFromJid(b.from.textContent),e.type=(null!=(j=b.type)?j.textContent:void 0)||null,e.states=[],k=a.childNodes,f=0,h=k.length;h>f;f++)switch(c=k[f],c.nodeName){case"status":e.status=c.textContent||null;break;case"show":e.show=c.textContent||null;break;case"x":if(b=c.attributes,(null!=(l=b.xmlns)?l.textContent:void 0)===Strophe.NS.MUC_USER)for(m=c.childNodes,g=0,i=m.length;i>g;g++)switch(d=m[g],d.nodeName){case"item":b=d.attributes,e.affiliation=(null!=(n=b.affiliation)?n.textContent:void 0)||null,e.role=(null!=(o=b.role)?o.textContent:void 0)||null,e.jid=(null!=(p=b.jid)?p.textContent:void 0)||null,e.newnick=(null!=(q=b.nick)?q.textContent:void 0)||null;break;case"status":d.attributes.code&&e.states.push(d.attributes.code.textContent)}}return e},b}(),b=function(){function a(a){this.parse=d(this.parse,this),null!=a&&this.parse(a)}return a.prototype.parse=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;for(g=a.getElementsByTagName("query")[0].childNodes,this.identities=[],this.features=[],this.x=[],h=0,k=g.length;k>h;h++)switch(d=g[h],c=d.attributes,d.nodeName){case"identity":for(f={},i=0,l=c.length;l>i;i++)b=c[i],f[b.name]=b.textContent;this.identities.push(f);break;case"feature":this.features.push(c["var"].textContent);break;case"x":if(c=d.childNodes[0].attributes,"FORM_TYPE"===!c["var"].textContent||"hidden"===!c.type.textContent)break;for(n=d.childNodes,j=0,m=n.length;m>j;j++)e=n[j],e.attributes.type||(c=e.attributes,this.x.push({"var":c["var"].textContent,label:c.label.textContent||"",value:e.firstChild.textContent||""}))}return{identities:this.identities,features:this.features,x:this.x}},a}(),a=function(){function a(a,b){this.room=b,this.update=d(this.update,this),this.admin=d(this.admin,this),this.owner=d(this.owner,this),this.revoke=d(this.revoke,this),this.member=d(this.member,this),this.ban=d(this.ban,this),this.modifyAffiliation=d(this.modifyAffiliation,this),this.deop=d(this.deop,this),this.op=d(this.op,this),this.mute=d(this.mute,this),this.voice=d(this.voice,this),this.kick=d(this.kick,this),this.modifyRole=d(this.modifyRole,this),this.update(a)}return a.prototype.modifyRole=function(a,b,c,d){return this.room.modifyRole(this.nick,a,b,c,d)},a.prototype.kick=function(a,b,c){return this.room.kick(this.nick,a,b,c)},a.prototype.voice=function(a,b,c){return this.room.voice(this.nick,a,b,c)},a.prototype.mute=function(a,b,c){return this.room.mute(this.nick,a,b,c)},a.prototype.op=function(a,b,c){return this.room.op(this.nick,a,b,c)},a.prototype.deop=function(a,b,c){return this.room.deop(this.nick,a,b,c)},a.prototype.modifyAffiliation=function(a,b,c,d){return this.room.modifyAffiliation(this.jid,a,b,c,d)},a.prototype.ban=function(a,b,c){return this.room.ban(this.jid,a,b,c)},a.prototype.member=function(a,b,c){return this.room.member(this.jid,a,b,c)},a.prototype.revoke=function(a,b,c){return this.room.revoke(this.jid,a,b,c)},a.prototype.owner=function(a,b,c){return this.room.owner(this.jid,a,b,c)},a.prototype.admin=function(a,b,c){return this.room.admin(this.jid,a,b,c)},a.prototype.update=function(a){return this.nick=a.nick||null,this.affiliation=a.affiliation||null,this.role=a.role||null,this.jid=a.jid||null,this.status=a.status||null,this.show=a.show||null,this},a}()}.call(this),Strophe.addConnectionPlugin("disco",{_connection:null,_identities:[],_features:[],_items:[],init:function(a){this._connection=a,this._identities=[],this._features=[],this._items=[],a.addHandler(this._onDiscoInfo.bind(this),Strophe.NS.DISCO_INFO,"iq","get",null,null),a.addHandler(this._onDiscoItems.bind(this),Strophe.NS.DISCO_ITEMS,"iq","get",null,null)},addIdentity:function(a,b,c,d){for(var e=0;ef;f++){var g=b[f];a+=g.category+"/"+g.type+"/"+g.lang+"/"+g.name+"<"}for(var f=0;e>f;f++)a+=d[f]+"<";return this._ver=b64_sha1(a),this._ver},getCapabilitiesByJid:function(a){return this._jidVerIndex[a]?this._knownCapabilities[this._jidVerIndex[a]]:null},_delegateCapabilities:function(a){var b=a.getAttribute("from"),c=a.querySelector("c"),d=c.getAttribute("ver"),e=c.getAttribute("node");return this._knownCapabilities[d]?(this._jidVerIndex[b]=d,this._jidVerIndex[b]&&!this._jidVerIndex[b]===d||(this._jidVerIndex[b]=d),!0):this._requestCapabilities(b,e,d)},_requestCapabilities:function(a,b,c){if(a!==this._connection.jid){var d=this._connection.disco.info(a,b+"#"+c);this._connection.addHandler(this._handleDiscoInfoReply.bind(this),Strophe.NS.DISCO_INFO,"iq","result",d,a)}return!0},_handleDiscoInfoReply:function(a){var b=a.querySelector("query"),c=b.getAttribute("node").split("#"),d=c[1],e=a.getAttribute("from");if(this._knownCapabilities[d])this._jidVerIndex[e]&&!this._jidVerIndex[e]===d||(this._jidVerIndex[e]=d);else{var f=b.childNodes,g=f.length;this._knownCapabilities[d]=[];for(var h=0;g>h;h++){var c=f[h];this._knownCapabilities[d].push({name:c.nodeName,attributes:c.attributes})}this._jidVerIndex[e]=d}return!1},_sortIdentities:function(a,b){return a.category>b.category?1:a.categoryb.type?1:a.typeb.lang?1:a.lang|\\{|%)?([^\\/#\\^]+?)\\1?"+e.ctag+"+","g")},g=f(),h=function(a,d,h){switch(d){case"!":return"";case"=":return e.set_delimiters(h),g=f(),"";case">":return e.render_partial(h,b,c);case"{":return e.find(h,b);default:return e.escape(e.find(h,b))}},i=a.split("\n"),j=0;j\\]/g,function(a){switch(a){case"&":return"&";case"\\":return"\\\\";case'"':return""";case"'":return"'";case"<":return"<";case">":return">";default:return a}})},create_context:function(a){if(this.is_object(a))return a;var b=".";this.pragmas["IMPLICIT-ITERATOR"]&&(b=this.pragmas["IMPLICIT-ITERATOR"].iterator);var c={};return c[b]=a,c},is_object:function(a){return a&&"object"==typeof a},is_array:function(a){return"[object Array]"===Object.prototype.toString.call(a)},trim:function(a){return a.replace(/^\s*|\s*$/g,"")},map:function(a,b){if("function"==typeof a.map)return a.map(b);for(var c=[],d=a.length,e=0;d>e;e++)c.push(b(a[e]));return c}},{name:"mustache.js",version:"0.3.1-dev",to_html:function(b,c,d,e){var f=new a;return e&&(f.send=e),f.render(b,c,d),e?void 0:f.buffer.join("\n")}}}();!function(a){var b=Array.prototype.slice,c={dict:null,load:function(b){null!==this.dict?a.extend(this.dict,b):this.dict=b},_:function(a){return dict=this.dict,dict&&dict.hasOwnProperty(a)&&(a=dict[a]),args=b.call(arguments),args[0]=a,this.printf.apply(this,args)},printf:function(c,d){return arguments.length<2?c:(d=a.isArray(d)?d:b.call(arguments,1),c.replace(/([^%]|^)%(?:(\d+)\$)?s/g,function(a,b,c){return c?b+d[parseInt(c)-1]:b+d.shift()}).replace(/%%s/g,"%s"))}};a.fn._t=function(){return a(this).html(c._.apply(c,arguments))},a.i18n=c}(jQuery);var dateFormat=function(){var a=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,b=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,c=/[^-+\dA-Z]/g,d=function(a,b){for(a=String(a),b=b||2;a.length99?Math.round(q/10):q),t:12>n?"a":"p",tt:12>n?"am":"pm",T:12>n?"A":"P",TT:12>n?"AM":"PM",Z:g?"UTC":(String(e).match(b)||[""]).pop().replace(c,""),o:(r>0?"-":"+")+d(100*Math.floor(Math.abs(r)/60)+Math.abs(r)%60,4),S:["th","st","nd","rd"][j%10>3?0:(j%100-j%10!=10)*j%10]};return f.replace(a,function(a){return a in s?s[a]:a.slice(1,a.length-1)})}}();dateFormat.masks={"default":"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:ss",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"},dateFormat.i18n={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"]},Date.prototype.format=function(a,b){return dateFormat(this,a,b)}; \ No newline at end of file diff --git a/res/audioplayer.swf b/res/audioplayer.swf new file mode 100644 index 0000000000000000000000000000000000000000..72390d415719d633b1598a0cc253380c85fc2966 GIT binary patch literal 2680 zcmV-;3WxPWS5pW!8~^}#+MF0$PaErTyt~HB#SjR=+;S4g4RTJ>ko1}a0)fO_f}snE z`cheoy}+hxuVt@MP*tfHBP;^^3j3>vVFX8BRPa7T>;BQP*NE1< zT67GAFIGxWs(ZNZRizf4Zigqnw;K302&=EEkyn3RcPpOYr2)!b;2p8eqPkmc_>mu0 zq1XtU)$(IFIE}nU;8*+ziuC@5-rZ&tGSOgxBy^C2+wh=)Q2Ab~hfx@v);uQfo6s%$ z)g!@{L0%Fw1bgx4ei)(h+b-%;C%S;+BZAkwddaJj`n#bJvnF2}8n75cBex!rRNyz* zK{FXhZe+67th+>2mM_Iazut%#9qiHmmD&@Mfq&K9ChGM952+kh7J>h>o!^B)vqE}` zx0Ss;l&2onUI*?`16l^yFg-HztpSxD_K}(<(AibyCgwaCwS8&u|3Iq;tdwn7#!kzk zw*vm#rj^=h^|Nm)!#vGS6OSIJ)eCkeW5gia5euyXva);et*<~!iHdVXx_*rgHyB96 zPAkp6v$(S%xeXRtDB=bQKO$rsQn*cx@(OVs-e8myfMSuHYP%69_l*IgortSW?sph0 zBn;T21^h_mxMbJPSe!t59xD2}FKe18Sw+H3}je%+7l%1 zBqOtOtzodIEW@6*O#8ZJWlW@4T@okr1>fJ8haun)zQv7#q`0ZsF!oAuPBY4eGX*Bb zzma*iLky-sN>^ak=~U{LBaY;Dft~N5ejIn4oY>}W7kTd~dG9ESKMIPu0@-$hab%Jb zSK(@7+|}ln+3Ivk82WyJZEon|eTm|c%5&+||En^szm4k!gRhjR3(&IpdBz6Vx$uYt z50E@=DIRNW`VI2cpLX)?Z2Od7mW|H{6yR&1lNMNheZI}@rV}RfeU#Kw(~^T-yoS9QacxTN4A@H;PXMA869GyKXjPd zfB8CfK_KQef66L&U1Xf#4CynuZlP#HrAei zUw)z$26WQdG3K^e)=Gt!ERtMkD>n2hwJnYs=!SY@KdaafN^ z&8Pt@^*UygqF?o+E$>vzJUa*Py;6knkKng8U`Wggt6^D-e79VF<2NF&$|fxQ*b{6M zqm3BEhE8`}Mhr&bV!uel&CvJfM&wlglB=pO3 zkLI6Y-tdA$ASNeF5c&3&RzuN?uST%H*^qQ`0*cd1#r3OD@uK6f+}19=Z){ZArAdQ_ zuvd>xWe(BO2fx`kh%Z0HjmLp@J0epI!FDgZ1iA21BW{93&lcZ=u{5y2&mcIb%`uJ0a4f0Zy<*(UbW{v%2L8?_N6`$JA~oyfgS7#oCuK}>q9f^1Q1;B^HA0&RCqdpk z^%SV5>!WA?pD=O6v;zfwQqC%<>~^xO-LMB`0^-6CCF}kM-&M&f zJ3;zRs+$!@z^4d4-2uN&@Go?DJO3LFBe{7Q$qbRqUPf|@NN%?YAhCByj5|73o$p=3 z-MftWoR}imEbx|@mM$UCF&(L{2tl^=LyJ58!p{rx<;YP-6ur$LjwPZoZiu@fRQs9z ze1;vc!2%H13=_21GUBl8=vtq2@J9pYUrONjb$oj>`&Q1UJ@%JkKF!h<#tytN*OB7mEEbaO{gu7d;`Yi$0it8S mp?9&=_)#%sNhT+XtE?sBj>pMi+5z|<00030{{sNu + * @author Patrick + + * @copyright 2011 Amiado Group AG, All rights reserved. + * @copyright 2012-2014 Patrick Stadler & Michael Weibel. All rights reserved. + */ +html, body { + margin: 0; + padding: 0; + font-family: 'Helvetica Neue', Helvetica, sans-serif; +} + +#candy { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; + background-color: #444; + color: #333; + overflow: hidden; +} + +a { + color: #333; + text-decoration: none; +} + +ul { + list-style: none; + padding: 0; + margin: 0; +} + +#chat-tabs { + list-style: none; + margin: 0 200px 0 0; + padding: 0; + overflow: auto; + overflow-y: hidden; +} + +#chat-tabs li { + margin: 0; + float: left; + position: relative; + white-space: nowrap; + margin: 3px 0 0 3px; +} + +#chat-tabs a { + padding: 4px 50px 4px 10px; + display: inline-block; + color: #ccc; + height: 20px; + background-color: #666; + border-radius: 3px 3px 0 0; +} + +#chat-tabs .active a { + background-color: #eee; + color: black; +} + +#chat-tabs .transition { + position: absolute; + top: 0; + right: 0; + padding: 0; + width: 35px; + height: 30px; + background: url(img/tab-transitions.png) repeat-y left; + border-radius: 0 3px 0 0; +} + +#chat-tabs a.close { + background-color: transparent; + position: absolute; + right: -2px; + top: -3px; + height: auto; + padding: 5px; + margin: 0 5px 0 2px; + color: #999; +} + +#chat-tabs .active .transition { + background: url(img/tab-transitions.png) repeat-y -50px; +} + +#chat-tabs .close:hover { + color: black; +} + +#chat-tabs .unread { + color: white; + background-color: #9b1414; + padding: 2px 4px; + font-weight: bold; + font-size: 10px; + position: absolute; + top: 5px; + right: 22px; + border-radius: 3px; +} + +#chat-tabs .offline .label { + text-decoration: line-through; +} + +#chat-toolbar { + position: fixed; + bottom: 0; + right: 0; + font-size: 11px; + color: #666; + width: 200px; + height: 24px; + padding-top: 7px; + background-color: #444; + display: none; + border-top: 1px solid black; + box-shadow: 0 1px 0 0 #555 inset; +} + +#chat-toolbar li { + width: 16px; + height: 16px; + margin-left: 5px; + float: left; + display: inline-block; + cursor: pointer; + background-position: top left; + background-repeat: no-repeat; +} + +#chat-toolbar #emoticons-icon { + background-image: url(img/action/emoticons.png); +} + +#chat-toolbar .context { + background-image: url(img/action/settings.png); + display: none; +} + +.role-moderator #chat-toolbar .context, .affiliation-owner #chat-toolbar .context { + display: inline-block; +} + +#chat-sound-control { + background-image: url(img/action/sound-off.png); +} + +#chat-sound-control.checked { + background-image: url(img/action/sound-on.png); +} + +#chat-autoscroll-control { + background-image: url(img/action/autoscroll-off.png); +} + +#chat-autoscroll-control.checked { + background-image: url(img/action/autoscroll-on.png); +} + +#chat-statusmessage-control { + background: url(img/action/statusmessage-off.png); +} + +#chat-statusmessage-control.checked { + background: url(img/action/statusmessage-on.png); +} + +#chat-toolbar .usercount { + background-image: url(img/action/usercount.png); + cursor: default; + padding-left: 20px; + width: auto; + margin-right: 5px; + float: right; +} + +.usercount span { + display: inline-block; + padding: 1px 3px; + background-color: #666; + font-weight: bold; + border-radius: 3px; + color: #ccc; +} + +.room-pane { + display: none; +} + +.roster-pane { + position: absolute; + overflow: auto; + top: 0; + right: 0; + bottom: 0; + width: 200px; + margin: 30px 0 32px 0; + background-color: #333; + border-top: 1px solid black; + box-shadow: inset 0 1px 0 0 #555; +} + +.roster-pane .user { + cursor: pointer; + padding: 7px 10px; + font-size: 12px; + opacity: 0; + display: none; + color: #ccc; + clear: both; + height: 14px; + border-bottom: 1px solid black; + box-shadow: 0 1px 0 0 #555; +} + +.roster-pane .user:hover { + background-color: #222; +} + +.roster-pane .user.status-ignored { + cursor: default; +} + +.roster-pane .user.me { + font-weight: bold; + cursor: default; +} + +.roster-pane .user.me:hover { + background-color: transparent; +} + +.roster-pane .label { + float: left; + width: 110px; + overflow: hidden; + white-space: nowrap; + text-shadow: 1px 1px black; +} + +.roster-pane li { + width: 16px; + height: 16px; + float: right; + display: block; + margin-left: 3px; + background-repeat: no-repeat; + background-position: center; +} + +.roster-pane li.role { + cursor: default; + display: none; +} + +.roster-pane li.role-moderator { + background-image: url(img/roster/role-moderator.png); + display: block; +} + +.roster-pane li.affiliation-owner { + background-image: url(img/roster/affiliation-owner.png); + display: block; +} + +.roster-pane li.ignore { + background-image: url(img/roster/ignore.png); + display: none; +} + +.roster-pane .status-ignored li.ignore { + display: block; +} + +.roster-pane li.context { + color: #999; + text-align: center; + cursor: pointer; +} + +.roster-pane li.context:hover { + background-color: #666; + border-radius: 4px; +} + +.roster-pane .me li.context { + display: none; +} + +.message-pane-wrapper { + clear: both; + overflow: auto; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + height: auto; + width: auto; + margin: 30px 200px 31px 0; + background-color: #eee; + font-size: 13px; + padding: 0 5px; +} + +.message-pane { + padding-top: 1px; +} + +.message-pane li { + cursor: default; + border-bottom: 1px solid #ccc; + box-shadow: 0 1px 0 0 white; +} + +.message-pane small { + display: none; + color: #a00; + font-size: 10px; + position: absolute; + background-color: #f7f7f7; + text-align: center; + line-height: 20px; + margin: 4px 0; + padding: 0 5px; + right: 5px; +} + +.message-pane li:hover { + background-color: #f7f7f7; +} + +.message-pane li:hover small { + display: block; +} + +.message-pane li>div { + overflow: auto; + padding: 2px 0 2px 130px; + line-height: 24px; + white-space: -o-pre-wrap; /* Opera */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +.message-pane li>div p { + margin: 0; +} + +.message-pane .label { + font-weight: bold; + white-space: nowrap; + display: block; + margin-left: -130px; + width: 110px; + float: left; + overflow: hidden; + text-align: right; + color: black; +} + +.message-pane .spacer { + color: #aaa; + font-weight: bold; + margin-left: -14px; + float: left; +} + +.message-pane .subject, .message-pane .subject .label { + color: #a00; + font-weight: bold; +} + +.message-pane .adminmessage { + color: #a00; + font-weight: bold; +} + +.message-pane .infomessage { + color: #888; + font-style: italic; +} + +.message-pane div>a { + color: #a00; +} + +.message-pane a:hover { + text-decoration: underline; +} + +.message-pane .emoticon { + vertical-align: text-bottom; + height: 15px; + width: 15px; +} + +.message-form-wrapper { + position: fixed; + bottom: 0; + left: 0; + right: 0; + width: auto; + margin-right: 200px; + border-top: 1px solid #ccc; + background-color: white; + height: 31px; +} + +.message-form { + position: fixed; + bottom: 0; + left: 0; + right: 0; + margin-right: 320px; + padding: 0; +} + +.message-form input { + border: 0 none; + padding: 5px 10px; + font-size: 14px; + width: 100%; + display: block; + outline-width: 0; + background-color: white; +} + +.message-form input.submit { + cursor: pointer; + background-color: #ccc; + color: #666; + position: fixed; + bottom: 0; + right: 0; + margin: 3px 203px 3px 3px; + padding: 5px 7px; + width: auto; + font-size: 12px; + line-height: 12px; + height: 25px; + font-weight: bold; + border-radius: 3px; +} + +#tooltip { + position: absolute; + z-index: 10; + display: none; + margin: 13px -18px -3px -2px; + color: #333; + font-size: 11px; + padding: 5px 0; +} + +#tooltip div { + background-color: #f7f7f7; + padding: 2px 5px; + zoom: 1; + box-shadow: 0 1px 2px rgba(0, 0, 0, .75); +} + +.arrow { + background: url(img/tooltip-arrows.gif) no-repeat left bottom; + height: 5px; + display: block; + position: relative; + z-index: 11; +} + +.right-bottom .arrow-bottom { + background-position: right bottom; +} + +.arrow-top { + display: none; + background-position: left top; +} + +.right-top .arrow-top { + display: block; + background-position: right top; +} + +.left-top .arrow-top { + display: block; +} + + +.left-top .arrow-bottom, +.right-top .arrow-bottom { + display: none; +} + +#context-menu { + position: absolute; + z-index: 10; + display: none; + padding: 5px 10px; + margin: 13px -28px -3px -12px; +} + +#context-menu ul { + background-color: #f7f7f7; + color: #333; + font-size: 12px; + padding: 2px; + zoom: 1; + box-shadow: 0 1px 2px rgba(0, 0, 0, .75); +} + +#context-menu li { + padding: 3px 5px 3px 20px; + line-height: 12px; + cursor: pointer; + margin-bottom: 2px; + background: 1px no-repeat; + white-space: nowrap; +} + +#context-menu li:hover { + background-color: #ccc; +} + +#context-menu li:last-child { + margin-bottom: 0; +} + +#context-menu .private { + background-image: url(img/action/private.png); +} + +#context-menu .ignore { + background-image: url(img/action/ignore.png); +} + +#context-menu .unignore { + background-image: url(img/action/unignore.png); +} + +#context-menu .kick { + background-image: url(img/action/kick.png); +} + +#context-menu .ban { + background-image: url(img/action/ban.png); +} + +#context-menu .subject { + background-image: url(img/action/subject.png); +} + +#context-menu .emoticons { + padding-left: 5px; + width: 85px; + white-space: normal; +} + +#context-menu .emoticons:hover { + background-color: transparent; +} + +#context-menu .emoticons img { + cursor: pointer; + margin: 3px; + height: 15px; + width: 15px; +} + +#chat-modal { + background: #eee; + width: 300px; + padding: 20px 5px; + color: #333; + font-size: 16px; + position: fixed; + left: 50%; + top: 50%; + margin-left: -160px; + margin-top: -45px; + text-align: center; + display: none; + z-index: 100; + border: 5px solid #888; + border-radius: 5px; + box-shadow: 0 0 5px black; +} + +#chat-modal-overlay { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 90; + background-image: url(img/overlay.png); +} + +#chat-modal.modal-login { + display: block; + margin-top: -100px; +} + +#chat-modal-spinner { + display: none; + margin-left: 15px; +} + +#chat-modal form { + margin: 15px 0; +} + +#chat-modal label, #chat-modal input, #chat-modal select { + display: block; + float: left; + line-height: 26px; + font-size: 16px; + margin: 5px 0; +} + +#chat-modal input, #chat-modal select { + padding: 2px; + line-height: 16px; + width: 150px; +} + +#chat-modal input[type='text'], +#chat-modal input[type='password'] { + background-color: white; + border: 1px solid #ccc; + padding: 4px; + font-size: 14px; + color: #333; +} + +#chat-modal label { + text-align: right; + padding-right: 1em; + clear: both; + width: 100px; +} + +#chat-modal input.button { + float: none; + display: block; + margin: 5px auto; + clear: both; + position: relative; + top: 10px; + width: 200px; +} + +#chat-modal .close { + position: absolute; + right: 0; + display: none; + padding: 0 5px; + margin: -17px 3px 0 0; + color: #999; + border-radius: 3px; +} + +#chat-modal .close:hover { + color: #333; + background-color: #aaa; +} diff --git a/res/img/action/autoscroll-off.png b/res/img/action/autoscroll-off.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b8aa69405f27c8f0eea086ab7ddf3c5f874c39 GIT binary patch literal 442 zcmV;r0Y(0aP)4~ za^wg@WMm{GZUY#ha*rN?48btq_pe_dH3C592L>cpGvRYyYilcO2h;qQFEI!`1-e8~kl~G!3&VRR zW~^St8V0;KZ!icQJq%{Qv$13Ntfo$UI#B-dnStlr83qPEK8Ej(&J28J<_vs5@rMr| z5@moU&(_C4cmc#ue*rbWwYGt4!lxNqI$(MH@Zs;rPo7{XymRLcLtK13B(Y#k2N1zON0u+g k>0bscIhT>r>}92|mcnpvV#YSn9~mIY+n8wrrC>EMaFd{myGX z)}!i9!MBo*OSpahv%R51B}wz>5eZ%H4^4lv_Lfg-ynXSsmdKI;Vst0Jz>!WdHyG literal 0 HcmV?d00001 diff --git a/res/img/action/ban.png b/res/img/action/ban.png new file mode 100644 index 0000000000000000000000000000000000000000..b335cb11c4d1a397b307883adcfe1e00c4cf8e6a GIT binary patch literal 796 zcmV+%1LOROP)h5&w{Y-QlBkdy7eSyz8|k(w=syt3MbOGZFmTy2f|dnI3kj6Sz)H!` z%1hM3FiovS8#Qs98Rxs5^PSs#9S4da6*};44(Iv3@B5rb3BwQ$Is?0$0ilY#Q^EELL=6SfS*Ly93GR<|lPYvfPXoM^)HN1)!-B@N5Zi(e|Ge`rl{XLurIiz-D}wHL_^0`U`~aor)ql1d5Pg z6owrVjF7Of7j1n54cD~V+Wq~W=b7nXZIaQU<}$-D^Wh8g9iyuJPn7-MaF0z&l@1k7 zi;z(T6-GoDP~qCfbDCc}Z`LYsk4>`*H%xtJgQ?D-@mf%i7IOIIQNnlKSrOW6T6Aa~ zzzv!ft#0lKwzQ#%D*U(CNVtT$BA5z-ik%o65YF5q{4ms7cV2r-06S=ERhf?MznhZa zGrpJw`vq|!>WixoQA~L~vGVh0X>qPIVC$n@kA zgAe9Vv7m|wv0n;2S!@A_bF_Ik?_SL^JGp@R5EaWzcA1Gc%VZkUm>_}pGHl31$w(sf z+uZ2Ept_z!a-O424U9dTV*JG{cuTUO^>-YP_8i z`v#vMN1_$fg^2rkMu;VMV$!FWzJD?AEISTe*2Mszrd1b3X#X~G3v?T?bR#BKi;99M zL3}eC>Q11E<1D@G!$!0px~z-qtUQ0moD|RXC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/res/img/action/kick.png b/res/img/action/kick.png new file mode 100644 index 0000000000000000000000000000000000000000..bce1c9768634180771b1fafebf331ef3db780208 GIT binary patch literal 859 zcmV-h1ElpF8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE;u(kfL#Cp0@z7JK~y+Tos(-zlVKQu{Q*Tm5%eJ<%97}eboNxNk%yKwYTC4w zH8Dy}T}#{6YO7q!bfz|U%IT)1n3+~qmf6WlJE+6R&P4}=`U3@5?-uydm!KZFK3>;- zKMy=%VgGRgu056k$F3hwPpiNGlRo6heJRKcw;tiDEtTF=s*%xv(P+eAFrd@vC@LyK ztJR{>XvoXUBjDM~kSB*%7mx9Eu!+yl&e2h(;Qq-JF`(D$sjjXL;cz%YIGxTAgYF!@ z^fwAL@xI5-o7*<7ly0KivOx?4r`oISq}Vo$$}X3SAkQ4T`ShfLx80?@x?vHpa=Bz9 zo#q5F5L{VamW1SZRA_2Ybi3Ul`l{4??5z#S!&glLW-eKixolW124of~Sq&<7`qGF# zyo42oNR|{XBvLbvhvh0h^mrKVF!8)y&+|3|?G_oWg)4psq$gqqGV8Ze^|*xcUJE4; z%oN`@V!CsH1-Y}idoq=GckF_wW2mKoZ+FvaD^8#(KXN2&jWyb<_NPb&!WpB=XF;Ffo2WwJ2D`UK!n@xYcnz!v+X+0vvn-wm;LG-?5$SadrZ(GaU>n#nBn zbiy;H(Qc6N;z}`3>oV!{Y@_c?2CXIut{qdwfJ&tzM!TH2eNlM5UTSM=L)6vPaiK6u zxc^~6+|ENsDvzA$v>aNET{T$@D3wZTYHEnhUpXoUWuMPSW5HqqEqX!TLQkcf2UQBr z8{?=@P7nhMh2oE?K{1Hm@5i4rpMj?R3<~r&Di}MF#v89X?19G{X#NF=y3!#P{9h!$NGm&{VG9bZSYA)3<7W5mGUzNIr`$|T{w%PP|*ZZA(A lUtFdb>nm4I_$dUw{Q{y_0qVHs(>?$I002ovPDHLkV1jYJiE#h` literal 0 HcmV?d00001 diff --git a/res/img/action/menu.png b/res/img/action/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..be4540c436f6ac2a09e7f99cc7277c2579eadc78 GIT binary patch literal 1229 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRV!3-o9^qNHiDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(gFvFf#=Bgt!95?dkO-!8JjERGZgNx4o8zwI5pnrkJT^AW7B+k01lLkoCLBu@bfRhnJSkT}{ z5cwz-C?AEk;`Q7|NyO0V@Jst%?>X<@)8|?6hNplZoH}p}R=_wBd4A);huvr*D{8ta zv>weaRZy(zA{a{x)NMK$oUyoq;&Q_jA9Yid>V_!Q3{lkDazCTg+2GL8fKO$yVv7pZ zw#ZdlB3o|B^q?JFdAt+nq80!As0d}1Z|KFR(*lEh^G}{es&~_I}wY;n4d5jAs0d}gj@(+ z%6*K*29I(Myv%_UPWDD&5qS@s3~ZAJGDH vT*SlN0ce3)r#d%-F%SaNZe6;L@E^Vb!Ji3~dec0&00000NkvXXu0mjflI-*P literal 0 HcmV?d00001 diff --git a/res/img/action/settings.png b/res/img/action/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..327fdf496396160bef8fdc76c4bbd6d506e17f2f GIT binary patch literal 744 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 KMNUMnLSTZ{UFO&T literal 0 HcmV?d00001 diff --git a/res/img/action/sound-on.png b/res/img/action/sound-on.png new file mode 100644 index 0000000000000000000000000000000000000000..b4351604a72146d2d6a6d9664a31f5f8887f145e GIT binary patch literal 544 zcmV+*0^j|KP)6Q4q)Hxhv>F5XFOD zyhwp~5$aO^Le~z_(G3HsjKxC)60s79D6v$KKcGLMi2j4UdGIC)86tTT5&ZqLnWcRg zm=_N{7-rsk^ZmS;_jcKQK8JON3Dz7d0m)?YAdyIXt;!LXEv8Z_VK$pxO{Y^Cy>)S~ zP$)>_@%Swq4mUU;lgaEDcR?OSPfn-P=WsZnR4Q?CE|s1hd3}1o-8+5toFXHj|sl{TU z_?-i&&vLn}mrZ1k#{={NbSlAOvDibq-HxE>l`(cpP|Q;~04KW$;f57`5X9wjf$_X} z@;&D5<4Zxa*(|2h={s6y%l-vPk_248#_$}?n$PE%u@{X-kFkOmRaG1O!}-fXq0k{( iV^t3O_rLL5fB^u?I7KURR%+k?0000;g_qz*)!Uw0*DfRXB;qLAZ$z&48$H%z2xj}zd7hVyg6N6#;htp{#NP?4R z417M{qf)7~(c9Z=ZfR*jEEWT!Znat&eI%k$nAXm1_LT%V~|CWUn)~}CPO}w6D0uA_U`QLz}VObX?>l8+o_crj|VEU zjgF3TW~?-c*o4Dj2JP) zl!zA)6l}D~3s`Em?4?Yhi=C~d53rSX$*wCZR^kIl^a0euLX9ZwZt#MNuJ=o34*0Xl zCQULhaORxv`)1C}Io$Dhg#WP*zi;GnIm>RhyEq&U*X#BA4A+23e&EqpTt9|Fq4rxm z_qKveCKE)`om#EdSu7TiNF;23xm-e{(ST;N`GVnXG#bsn6G*4i!PRQ@#qDf>g!`G#b@Mx%jFrvp^F*=(lr zSC3E+Q2KUt-yMtyT-IRtxYNu-$IKWHK=kT4Ms}^?IOE zslefI=rO(|E)&4u%4)U3U@%}{Dx19BZZkn5lP?wvhVghjl=Mmvz`LJIrBWD=$BalK zlM#?I(Y?uMvl#;unPTb-Hc-F{6=3i*pU*)qm$POO zn6iC>gs+P|q(C6R(>S}`E}J=tD3wYu8jXyc z&1PRkBGFAEk;uP$%8^JUh#Bu(E|<>h^|A(%Q8UZsGFA41nQxQHWd4tTfh-&jTX63J t{Tj2MF%ZYG&xCuANdEh0`WO2tzyND}g0&6oyTSkf002ovPDHLkV1h8tDD(gT literal 0 HcmV?d00001 diff --git a/res/img/action/subject.png b/res/img/action/subject.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc9233ea63c89d52a99494dd0f0735a29a3ec3b GIT binary patch literal 413 zcmV;O0b>4%P)i2vikyMR~)n*keF9=!Gc_n*K2@qsNT?}H4v4a974 z1ArVJApZ0B-@pGKzWw|E^3%Wn&p!V9|K$C@{}12&`+x7vzyG&i{r!LE6~yrB1;;^# zm?0Y=moxPMSn>r>N00000NkvXX Hu0mjf$^yWL literal 0 HcmV?d00001 diff --git a/res/img/action/unignore.png b/res/img/action/unignore.png new file mode 100644 index 0000000000000000000000000000000000000000..89c8129a490b329f3165f32fa0781701aab417ea GIT binary patch literal 781 zcmV+o1M>WdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C(G`SI(6vnfMgxg){D+Lwutc1Si0swhN#FwOv#}l83ts6rCW;r!9Q9l zl<41549yYiq6clJ;(J(YgF_14nmKFB@QK(mo6I~sr{BJxJ$rsp0HSt^ntND0Z;o48 z>O2Ckm9}n?$F`*>$L{;{zT>f+bCm7tpaqw^4q@%k z&cHHt3=3xZmt6rQ_dtDM#)Xwp66-Thu=<9?(zFvpy0gAr0U4Z3smE5f@pZNr!NoqT zEjSPuCQzMw(H;?yvf{+e;!7(;4hv)+d%cjKFiBL%egy0aeCof8z<>rLEjMsF|CBRH z86WcxAYvS6H;Yq)jY1Z-rrjWiu~m;clLmJlDAE7UhMJ*jBxp}s&nQkrZvqDXxsiv3 zSJ78>4W2GFIu$$+Ic&5Pq{1?zhIy(24enCZy35e>z6~XgVx$x%k(+>tPw)9SL~R?4 zs${`1bqjTFC3F)dxIIw>)!QP7$vk+;^#2c5r{lsjtwKYnfnn+j{~{GK;|I8rvPFU z5NbS#W7m)ofjNER&&ggR6fXi0xd4%4143#8JZlhXW+2TN#8b=5@L&-EUlY^cTT=>w zb_~+jfcRCYfdj}H0J49#sP#gtxE~%YBJiQ3AjMgoQJKuMITA}Iz|zizG7pw|7R*XF j=$D`QjOCK>V3B}dL4UFUkhgq600000NkvXXu0mjf1x-zB literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Angel.png b/res/img/emoticons/Angel.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf707b7deb4f3ae538590908a1585037d18229c GIT binary patch literal 3467 zcmV;64RrE}P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0008ENkljQKU$W8JcvFOp~duGBX)7_na=~#pVx(%ekEY z2bX({ssa!Mz6Xo~XMt|uD3Ao+1Is`Gm;!ze!(0`>#>DS{8ZZV-0~df}VVE;ON8C@v z;_rgMzXafkxNhJM@Oc>KevG21Ef)DcilTeKY2YyMIt+8Sq9~dKZbVV^r}6#lU0@NI z1b*u5>>Tar=p>a&(R#R*e~Lwl#UgK)-cnd9OvNeA0ACp2&vpY3fc@!o=3pk1K~Yde zRZ(c1syv*TA)n9x3#I=ANmLaTa95tK*!*ImdQ=o0a8ds?{paIo8+L0p=|*xv;Q+s8HFeFg-m@{!yNCrHrUh zE|+=o_$g8J2OnxR6k+krBEYZ4_p=@_m;Nl>+t=4iZL7wM7cVKUtzkV6S9he2r06@* zOCphAer}%GXU~7Te*MO%QB{J#Z@1Rw2L=aP`v>|l2EYKI+IXbxdYxAKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007{NklS*SDgg2tS291P0qxai*hX^{=H=)mE?kKe~RaLy?a z5sD)k9q0jifP+8_Fb~WD6Q(&hQS2@G2S=j=2Jj#h3Z1F14-p6i@cDhLW-??l89sjc z$mdU=p8=Olb1+wcqtStVKs*xZ@O5-_AP9&cA_)AgBD{{ph{xkupv5!?S2d*^4S3nr z-CcjEwUtyV#f}|25u^Z#2&r%12seb$bgeR#O4S`ceB`kfiL_s6YHGUDd8`v_)8fha zI2#)q>@^H@T_>N4pH zolZ0RW|l-E!P3$a-YPF$-JMiaR3IW~nocsA^yolqO(1|Mg&>TKi~w-!_N~Im!}o`o zo}T8~^?sBHhEWZ0PzQ{1PdQ2y#cNYaZNsXdIZ7d-aJgLoyLBLES(f4Pcn}e8+`NH^ zpp;YS+}D2$+aKzo7wJIoOVkvz@=~-*_s@S@^KX{JZySZnyhnTU*;k;kJi{?(Vg1`$4cS zcsdlWr`j-ZyL7Bgi?!7?zI^%0_vQ2puea)QUtfO~kdps=)j8lI&ma*HBzgWscxP00000NkvXXu0mjfMT>G- literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Aww.png b/res/img/emoticons/Aww.png new file mode 100644 index 0000000000000000000000000000000000000000..35128639878e612a94e417b5b9e5cb533345c068 GIT binary patch literal 3352 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 g9#~dx(LLRsaA107*qoM6N<$f|yfDdjJ3c literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Blushing.png b/res/img/emoticons/Blushing.png new file mode 100644 index 0000000000000000000000000000000000000000..ab03ee8c5dbc3e33c04758e04833b9ac26000618 GIT binary patch literal 3403 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Childish.png b/res/img/emoticons/Childish.png new file mode 100644 index 0000000000000000000000000000000000000000..1a31c5068eecc6ec4e9eef75f7eea1edf039545c GIT binary patch literal 3411 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Creepy.png b/res/img/emoticons/Creepy.png new file mode 100644 index 0000000000000000000000000000000000000000..561505895f4d9c5ba20adad5687a12b8f9691359 GIT binary patch literal 3417 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 M07*qoM6N<$f;S>^egFUf literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Cthulhu.png b/res/img/emoticons/Cthulhu.png new file mode 100644 index 0000000000000000000000000000000000000000..fafc4b3eb8ef33898d36ee7d7d5d897b5938109e GIT binary patch literal 775 zcmV+i1Ni)jP)3LBXkZp5`~YJ~1YGD!FhPllXaXx%*2bMXDK+60jHw!TG)gg21C&q< zR63m!p);L__Z!+~{F0NKnYm}qz2`d?UDshgBO}8XsRRhO2wuV#VU{p8I{GAL?zNc7 zM11b?cph|jUxv@;L#3w@*=!cS5(z}3QHY{APCs~9CNMI?@bIH&q0nnRpU>;6s_KfO z=!HT-mt{$pq`WTXL_HXMrL(>g$51B4R#J=y0{w6}9P~jmK59mj22DGzNBJX!f+6H` zxi*?$)mj`N(ACui`w2T#O+ALnpp>gZ;A}Q@bhe}D3AiG;$9KVp&5aE#EH2V6z}0J4 z(Aanuo0~~2Eq#E6US7X(6HQG`h;pBLiF2={T+7CNH$9Dh8ol#U2WDnw47Erkg2917 zw0E>49G-@=!U?M8XlHl4)gQ=jRrTy|bbKtJS)1CWqJ7e!}nf zV`6dwRn=ACc^(#v1$-}$7ca-*KIukp50Bm7yJV_!&b;$fZ24QDrR6;O`fh_=y+$gB zM~C1XR`l?G=;SzCV{2<0b#-Tg|Al01?CE4{TkAl5eLWkieE&w1#Y&*v(rF~t5^siv z?%$!;QfX{RlJq#f5{FVy;B-2X-b-VBeI5Jze-K~!jtaLEsZ2SbzxIMhJAYFhR<7f|36TFaUG4ZVu`&00;m8002ovPDHLk FV1l&}T>St5 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Cute.png b/res/img/emoticons/Cute.png new file mode 100644 index 0000000000000000000000000000000000000000..a883ac321baafb635c6c1962351aef546666e84e GIT binary patch literal 3369 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 KMNUMnLSTY)_fPZy literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Devil.png b/res/img/emoticons/Devil.png new file mode 100644 index 0000000000000000000000000000000000000000..afc5c2cde5f1c81a28ea7ffa98e9580b98eaa348 GIT binary patch literal 3478 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 Ef?8yRuK)l5 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Gah.png b/res/img/emoticons/Gah.png new file mode 100644 index 0000000000000000000000000000000000000000..b03ee1b16308f6e5435dd19f5decda8bda418517 GIT binary patch literal 3415 zcmV-d4XE;oP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007lNkl0H(G!z6vi*#k_#+j)W)ks>QA>+-g7Lzl1-}gN&Mn$T#IULUOa1Q5rjwK@O zjznT~5EulaKs)dT$O6x7JNaxk*4ic~5~F_LUMLhAYH0}(3s^ z7Z#raH*Gt)wnI)NMw@||uCDId?(S{`0TDz5fpQk%#q=~YGcyj*ZrjP#3S)Ey@I2n% z-_qI9K`xiW=i84UJ0uZdd1;AATLjBv?Ok44ZtCgjO;vPtoxK`~L~h6WVhF;!w{Mx8 zd`?qiBYUc4P({YAOCWGTR zXl+nhgwweV~9qh)EzlOCY>cd5J$vNSyc(J&kL*- z3I%^nO${Q#@TFk@w01GZV2r`%^AR72@6^R&5#YNAm|Iy{*=cC4QQAc*g;ENwHLiAX zT^FTXv^F@71CaFssa!5M*l@G~_qWT$!~~XQm9^f|csnj!JdY90d~P1#ffsoA{@wdK zf!aWO^wcRXUl}PI!x+q##%x{LbvMbTU-9YV=cl%vOnGcOse#M0FK54|(;1XfxM~wu zmDf~ilhS61jnW3`xiqh`uN~mlf4$w*+%$CTcnE(WKvkue!mk3(s>9;KN0yhq{Oj$% tzG?)x0h|W>z#1?I+_&xIlik=q0|55KYjgdexQqY*002ovPDHLkV1hX&TLS<9 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Gah_2.png b/res/img/emoticons/Gah_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b682458ecec97465b493a32ebd1f9d7aadc95b45 GIT binary patch literal 3401 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Happy_2.png b/res/img/emoticons/Happy_2.png new file mode 100644 index 0000000000000000000000000000000000000000..13326863b561a163e9adebb1216af5ecd17c91d6 GIT binary patch literal 3433 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Huh.png b/res/img/emoticons/Huh.png new file mode 100644 index 0000000000000000000000000000000000000000..241f50f4f7f920c34c8527db952d2100d890e0da GIT binary patch literal 3417 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Huh_2.png b/res/img/emoticons/Huh_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a54e4b1a26bb8c6f5b1f3c3a8e0d24e55893e9 GIT binary patch literal 3429 zcmV-r4VvKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007zNkl-%FEm6vjXAT&XY>!uh%aHPjh2mu0DUsbsq_Eg=wsBvk0$x^)-t zuIfMNZV(J6fp%fgg~>#aEX9Hx_@g#MHW|zXOYr^iJzZ!fd2Y_l^PIzTp66&H!s!Z! zC;NeZpdDxf)_@gY)-WQor?J{!ayUHc1z!36{-Ne(KR%xiy;dii$&krp*x1})YjbNF zcxo7t+zB}xo@@dZZ{P0LySuv)1Vj)K1dh503yB1ai;H_en_)z8tFHqM&(6+HV^2?S+zkx3wzjr+b#^iLVUF5bAETpV z?C_)j$9xifkrBS63&FvZ<)7puVA= z)sYpn$ zHC{ALYj*?Qvhp&NC^|Yjn2JyF^2JL4LZJ|K^>s|er&wP8L@*ens;ZJh(*(HS26Dw> z(OX_#PHAZ=BO@cAX~6Ndm12B+3^WZ9!BI8`2M35q-UTf0?(U+LLMesqI5>`lZCluu zg=JfqwuNb#n3joUS!A;rL}bMc#FNQnf5YX5V?Pxl!p!vB6O99d_l}1&KqL{Re|+E*A(mj*X)nY};bx(<k!j2`TX%SU)H|v0Ruffy~Q)xZft5CYPsUaTT{dNb8d>i zi|l3h*xKA?C;jtmw*UL8hrkn{1MmVlU>S%SM&!+D?4JPuOlV-@ZK^>i00000NkvXX Hu0mjf#Q$b- literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Laughing.png b/res/img/emoticons/Laughing.png new file mode 100644 index 0000000000000000000000000000000000000000..edefc957a6d2bd34ef94fb9802f438e55ec6ee7c GIT binary patch literal 3450 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Malicious.png b/res/img/emoticons/Malicious.png new file mode 100644 index 0000000000000000000000000000000000000000..23f25792f1b43060839601610c345530888172ab GIT binary patch literal 751 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 RJ`ex^002ovPDHLkV1oKoYB~S_ literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Smiling.png b/res/img/emoticons/Smiling.png new file mode 100644 index 0000000000000000000000000000000000000000..725eef526d704d45f1bff18a035d666fc08f1445 GIT binary patch literal 3390 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Speechless.png b/res/img/emoticons/Speechless.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc424602ec5f925806a773663508b9fc3cfd35f GIT binary patch literal 3352 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Stupid.png b/res/img/emoticons/Stupid.png new file mode 100644 index 0000000000000000000000000000000000000000..3fcea491a5ab1d10a5853c3e65d256eeeb092b82 GIT binary patch literal 3422 zcmV-k4WaUhP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007sNkl&Pukkr23uR(@caEV_!`LPa^!M3(wQ{bO!g)4 z$g;)?d*Wy`(gGxd!B9ge6haUXK|~PPxgty_5+sw!b)d(x#_}$u92fBR>a}aF7tWvG zC4wM(B9WbEO{bbbOySux)*ECF)mX>(;?mdDK3I=IzZYG<}@*$A` zg#NyM&Yd&)`SaIcG#a_B19#4Lb)iHtF)@K@8knX*EEYqF;!Qk`X&M+tfXT^806IH6 z0PebhK%?J}Cg$gI^tu7Br^bU4Mfk=I;!{(I5(Wnb z(9jsTd6RfNjuIgp4kIE|RaXHVbpwS`spPG#sipBmBM*j$518fi`xv@EwClW}9EZ)# zEr4G-FtfI{hNB#|x3*bXUBPxL*!KUe*ne1EU176arearE&*uSVbznS|N})tiDwl}G zVoWEdDVB=Zj!m&xI8UP{+r5q}@ z&EotbpFhoRXqwhDIvU9x$hNNQPg`1B2HHE$;5~kv>Z&Tr<=<><6v$?>d|&$U+U3$8 zj*N_M94N-VR^0;b0Rg}Z6o47vnPrW=*w6ht0MvnBCijBnJOBUy07*qoM6N<$f^JG@ Ao&W#< literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Sunglasses.png b/res/img/emoticons/Sunglasses.png new file mode 100644 index 0000000000000000000000000000000000000000..cad8379742b4c580096013907243a56bf1ed5887 GIT binary patch literal 3433 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 M07*qoM6N<$g7k?-Y5)KL literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Thumb_Down.png b/res/img/emoticons/Thumb_Down.png new file mode 100644 index 0000000000000000000000000000000000000000..4f70696dd8b10a16342e3969778d9eff27912a6f GIT binary patch literal 572 zcmV-C0>k}@P)JP0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz-bqA3RCwBKQB7+TVGw?@yJYtu1a<>$ zJs4;N4Va|u!P;Xz)N?(lAP8ci(33a8^ic5!crnmc{Rv`0YzZ1e+6v0XlwOQWl71jb zwp58_Hy<{;&a7S0=)m(1GtWFT?>le6bzQK{&!6yUgyhh#DVSy67&O+qY~ zIg{(WA}`evhu}p6A%IEtsasf^9LE%hfZPj9L6x zJX0xG25Pk$^7%ZDz8@iaHVR3SuvOebwNiaVYkd{)Kknr7E|MD|+`4|_+QiW5Au#`R z`5Btc=6Mp7yhJ}zsr!dtYWwctw*xo(_O(m#W1kcHx52v(%0ZO?yJcf@;~l5dKL3w^ z#x}d1ZhB*V6EB{xpxtgiq};a8OZdOt(?95Y;>xK20000< KMNUMnLSTXlgbM5c literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Thumb_Up.png b/res/img/emoticons/Thumb_Up.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca0e0d087c7ade7a361215301e0f8f706690208 GIT binary patch literal 530 zcmV+t0`2{YP)JP0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzv`IukRCwBKQcX(&Q4~FsL*{BqGZ5Tl zi>UB3C|qRVwjWR=Z3BNmyKGUJ+kzlkxQ+S;u5uIfK@pjSK?^5{7M3YEexNhcy+ae0 zJvejcy*uZfbMGBN*LD0|8yg9ULY#2Axw&=Ko$JH@D>XM4Nx9wbOCoRo%CJH=5{Y#w zncUVjP16-c(RX%|I-PmVe2)TIs5YC;vQk%I9k3!AjpEy0uO*V7CaluyQ>jz}sUR2% zL6W36osa(zXu}6Nm&3r5 zUf&?gGUVb*nw=2gMlgRqB3US`efPUYXb{c_8Tv3|*77C50I#jx U5b25Rd;kCd07*qoM6N<$f+<<(%m4rY literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Tired.png b/res/img/emoticons/Tired.png new file mode 100644 index 0000000000000000000000000000000000000000..13f7d1207a113402d0cec35df8b7a2458ad11efd GIT binary patch literal 3338 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 UHHFj3_y7O^07*qoM6N<$g416#&Hw-a literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Tongue_Out.png b/res/img/emoticons/Tongue_Out.png new file mode 100644 index 0000000000000000000000000000000000000000..3d154f90810c28f70ce53df3a0c92adf1eb2aa88 GIT binary patch literal 3403 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,HK1WwBVi{nu{)^Q*2IV{RE^x-HA{*|z=D7_+L% h)A8}~=Rg_wH2}%HXA1+;WwihR002ovPDHLkV1nLbVM_o2 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Tongue_Out_Laughing.png b/res/img/emoticons/Tongue_Out_Laughing.png new file mode 100644 index 0000000000000000000000000000000000000000..fba5d751480e7bc6c41ebfa9ec95df203dacc7bd GIT binary patch literal 3468 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 RP3iyu002ovPDHLkV1fX+Q4s(D literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Tongue_Out_Up.png b/res/img/emoticons/Tongue_Out_Up.png new file mode 100644 index 0000000000000000000000000000000000000000..46328fbbeea90dc0ae964db14c4616dd41d402ca GIT binary patch literal 3362 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 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Tongue_Out_Up_Left.png b/res/img/emoticons/Tongue_Out_Up_Left.png new file mode 100644 index 0000000000000000000000000000000000000000..b67b69fb7a25805d0ea12c2708a6d5f2aeb2ac48 GIT binary patch literal 704 zcmV;x0zdtUP)HAjJc8BE|H%`@R}#2JZ1pwkcZ zp1*Nwy*p2@ts#@i$n1y`luVkYnrQL)&cuZ8*7$fg5JrMi$Z$s*xI94H!CovDz0v6H zWr@J4U@$lux*39YF1WLEZxRh-VUq9Yep*GPQbDy^g(R6UJu}S}MxpQnbO+GaXMrqpw~*sAFX!|5 zzXc*GiUO`YPs literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Tongue_Out_Winking.png b/res/img/emoticons/Tongue_Out_Winking.png new file mode 100644 index 0000000000000000000000000000000000000000..2a22cf6a9fcec5ccad18247dea6ea0b033f412a8 GIT binary patch literal 3416 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 U2pygf5&!@I07*qoM6N<$f+Ivk>;M1& literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Uncertain_2.png b/res/img/emoticons/Uncertain_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f5370d2c8c17e42caca23accdb5df652d00ea5 GIT binary patch literal 3378 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 IM6N<$f*F@bumAu6 literal 0 HcmV?d00001 diff --git a/res/img/emoticons/Unhappy.png b/res/img/emoticons/Unhappy.png new file mode 100644 index 0000000000000000000000000000000000000000..79fc0c00ff6b2d4e01efee3b5b72e789de0ba78c GIT binary patch literal 3408 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

            xLqkJBLBXt9vx0+z z)6&vfT3U*VissCj6A}^vRFIL8v3~t}psuZ3x5mZAty;AT$e1x>Mqgjw!i5VrZ{ExR z1B(B-{aizWogD*Qjr0td8G+)8|D>FYQWHy3QxwWGOEMG^vl1(E@)J|^GV{{%85DoA zaB>4x>3~cCIg)`@S3#jKC3D`A1ze9#F|BhDXtp?GT5!4g-t8Up`PiQbwr_dlaDqp# zc-=KF*R|7}u$iEekSM{LFmFYsO#8%r2W}l&`R3B{-sf-jzTO?7uQ7+U(OR%mf(e^O zGoaPoi8_xvR5+ESc#@YSEz&qCeSS;tYa^)x)0q!6?T!9;!dtNM?8VDFg#Bh73gy-k zndWy$0Gm;!K%sh?ZnNPIXC2es3CE9;xVzDKQ zRORYx-Mh5r1}S1Q$p{i2*EU5wa|xWh!{bs?P^jz4EwPWR;@(cX&6svLKJbMyWABM) zCs>o`d9A$qRSK)$%pu086vno!*p##^^JZ(}^o+-gw&l)>Aouc zGfbG`bs5aePA}N^AczB-lk_2GJpsCB#inmdKI;Vst E05l97fdBvi literal 0 HcmV?d00001 diff --git a/res/img/roster/affiliation-owner.png b/res/img/roster/affiliation-owner.png new file mode 100644 index 0000000000000000000000000000000000000000..b88c8578956ceec4ff17f81995b8652f6aa2b58d GIT binary patch literal 670 zcmV;P0%84$P)rx?szq&Dw38OK zY!^{rCAFy_2z8TV&4=Ube7+y|oYO*02OOyb5BD7I^ZdAQt`ZS+tMaFrb6^=AxbXHx zH;=|4CCm%L{PZwSS3v3G^sH+#W3JcR_xs(&`Tqt8^J9}d0vU#im5^f#04JL4qMaI^seoYDXwB>7;oyw=|M z1!ayym?6XvqV3ae_f95{py8ukt2TxB^!VIzRRh4#rNu~y^X+P>L{SXo3_|Qqm>9wY zz(9!5s#OBElpmj4DRyjO`0`RiEIkUg%7D)8y}}Ye3}prow;JG>UQOIs{kfZSJ9bYz zskMPbH9)1H6FDf)1=ZKVfe+;jf`a(O{!9meiN~~d0iA$0qX=t0D6Ydx4#RO76h@#R z9_k7Z;$fv6G>QeZ{Yu0n&xL4%!?l}UPj4!j&Vs@?dl=y8#_IQ`5I-5a_T$dJtJ_~5 z4&186>klZh{hfbaC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/res/img/roster/role-moderator.png b/res/img/roster/role-moderator.png new file mode 100644 index 0000000000000000000000000000000000000000..0d064d114012d7f70a27397bea8f71d1641d14b6 GIT binary patch literal 594 zcmV-Y0pF8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE;pxyoy-6L0nbT9K~y+Tom0C?Ye5uEWo2b^E5E`&v9Yo72mAsH38V>&MDwXqY zw=0v$L=ixZq|<5bTY^@rwTrM$;8#Q80^rSW@L(_ye3yQ|FU4X};_>)PG#b5*L?U`P z96k+&Li?shqcIx}hccZ`WwBVOIiJskdmxo^xhx=+cDt?Kk%we583B=Kn)awv!S4;b zESF0KWN=U=*jJsi*{md!Nh(l;Tmyl?%IEX#DFSTnpzw~;XS11-P2Vg=fRak36o^W= z`u+Yjz&}1^g2G*NdSLRsUQdAwg@TfsNF>yxe1KoQUhn?5fuhqHJJSY>adb+0EEfB) z;qiEM!{bDkD|)9DDj*prEs%t(%jFsw5+K2%&366m^q%M-w* zkzg?R2ESJrmu|OvgVdD@yWRd`NPx?+#^qS!d@sHhIUJ5to6YuQwOW4}5}@nxpYFTG gVmUIK%^&~8I~Pu>lX<}Gvj6}907*qoM6N<$f}|}6rT_o{ literal 0 HcmV?d00001 diff --git a/res/img/tab-transitions.png b/res/img/tab-transitions.png new file mode 100644 index 0000000000000000000000000000000000000000..c45d24c51723f356646e29d0bb76293fcff9c8ed GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A~!3HEXZgcMiQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiYz@{978H@CH?vT-`=^Z%F3RZx!FL#n_;7gz-fk!I#Z^# xbu~Y6e8r|Z!?IXSxufp?zrPc{aXU0HGAM>~o!+6W@epVTgQu&X%Q~loCID>=FjW8m literal 0 HcmV?d00001 diff --git a/res/img/tooltip-arrows.gif b/res/img/tooltip-arrows.gif new file mode 100644 index 0000000000000000000000000000000000000000..6faa6fd1f7fcbd8e4bcf30b58329f8157e3625fc GIT binary patch literal 66 zcmZ?wbhEHb6lUOJXkcXc{{8#^|Nj+#vM@3*Ff!;c00Bsbfl0EbzTq_6{YSG4&qm)p TTKf52>PdCBkWP(2Mh0sD&A=Ap literal 0 HcmV?d00001 diff --git a/res/notify.mp3 b/res/notify.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c00d997622f3e12d55d01e33ed1ba44c38c1184d GIT binary patch literal 1095 zcmezWdqN5W0T7Xymkw0I55&w23@q*pWrV;DLf}6k0JO`}$I;i-SkKa|h$#=`LLF@e z1`!7pc0WG`1_zKko^SiN6eKaM!T;X{zzAY&@;sKqyoJ#_xHkUq zJrtzY%c{ZqSa|2mip`~hMlfr|?2b*e~Um_GV2M-Yd;lV{32h%bRgQ zD@i+*k)h^lz?Dg!Dh#>%53ipiDkZDEv{0vuF;iFfViSwO%#|_`nqp$}ZKSwDr~Lo1 zu;b6w*Z(j7-fy+F{`c}1-Rx%9|Ns57_xh>X6Yl^6gOOWh2tFtE8?m6EvJz~I=V zc$iCpq4(70fd8M6aOE{leqFCpj(?ig>TW(;_rFkmZ~VV~)~d?;x3-(B zc)#BM`H$(*aBZ)3n?9EESp5^{*O{?l)7`HZ&Tum}h&28_w8L{xpKV=z!vrD8Kdc-_ zkH$Y*mM xqGz}Y2l)S6AVrY>0|P@QI|Bm;0|T$Z0|rK52rdC84Fv`UlLlZu!l9KUVE`GIgjoOp literal 0 HcmV?d00001