Commit e4cf875d authored by JC Brand's avatar JC Brand

Merge branch 'master' into otr

Conflicts:
	bower.json
	converse.css
	converse.js
	main.js
	tests_main.js
parents c0a4e957 c61eef99
Changelog Changelog
========= =========
0.6.0 (Unreleased) 0.6.2 (2013-08-29)
------------------
- Bugfix. The remove icon wasn't appearing in the contacts roster. [jcbrand]
- Bugfix. With auto_subscribe=True, the "Pending Contacts" header didn't disappear
after a new user was accepted. [jcbrand]
0.6.1 (2013-08-28)
------------------
- IE9 and IE8 CSS fixes. [jcbrand]
- Bugfix: Pencil icon not visible (for setting status update). [jcbrand]
- Bugfix: RID, JID and SID initialization values were being ignored. [jcbrand]
- Bugfix: Fall back to English if a non-existing locale was specified. [jcbrand]
0.6.0 (2013-08-26)
------------------ ------------------
- #39 Documentation for minifying JS is wrong. [jcbrand] - #39 Documentation for minifying JS is wrong. [jcbrand]
...@@ -13,6 +28,8 @@ Changelog ...@@ -13,6 +28,8 @@ Changelog
- Add a debug option (logs to the browser console). [jcbrand] - Add a debug option (logs to the browser console). [jcbrand]
- Use font icons from http://icomoon.io [jcbrand] - Use font icons from http://icomoon.io [jcbrand]
- Added a static mockup to aid CSS/design process. [jcbrand] - Added a static mockup to aid CSS/design process. [jcbrand]
- Save language codes with hyphens. Thanks to @seocam. [jcbrand]
- The combined and minified JS file now uses almond and not require.js. [jcbrand]
0.5.2 (2013-08-05) 0.5.2 (2013-08-05)
------------------ ------------------
......
...@@ -46,7 +46,6 @@ module.exports = function(grunt) { ...@@ -46,7 +46,6 @@ module.exports = function(grunt) {
"es": "locale/es/LC_MESSAGES/es", "es": "locale/es/LC_MESSAGES/es",
"it": "locale/it/LC_MESSAGES/it", "it": "locale/it/LC_MESSAGES/it",
"pt_BR": "locale/pt_BR/LC_MESSAGES/pt_BR", "pt_BR": "locale/pt_BR/LC_MESSAGES/pt_BR",
"sjcl": "components/sjcl/sjcl",
"tinysort": "components/tinysort/src/jquery.tinysort", "tinysort": "components/tinysort/src/jquery.tinysort",
"underscore": "components/underscore/underscore", "underscore": "components/underscore/underscore",
"backbone": "components/backbone/backbone", "backbone": "components/backbone/backbone",
......
...@@ -35,7 +35,7 @@ help: ...@@ -35,7 +35,7 @@ help:
@echo " text to make text files" @echo " text to make text files"
pot: pot:
xgettext --keyword=__ --keyword=translate --from-code=UTF-8 --output=locale/converse.pot converse.js --package-name=Converse.js --copyright-holder="Jan-Carel Brand" --package-version=0.4 -c --language="python"; xgettext --keyword=__ --keyword=___ --from-code=UTF-8 --output=locale/converse.pot converse.js --package-name=Converse.js --copyright-holder="Jan-Carel Brand" --package-version=0.4 -c --language="python";
release: release:
r.js -o build.js r.js -o build.js
......
{ {
"name": "converse", "name": "converse",
"version": "0.6.0", "version": "0.6.2",
"devDependencies": { "devDependencies": {
"jasmine": "https://github.com/jcbrand/jasmine.git#1_3_x" "jasmine": "https://github.com/jcbrand/jasmine.git#1_3_x"
}, },
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
"strophe.disco": "https://raw.github.com/jcbrand/strophejs-plugins/75c8693992bc357c699b6d615eeb396e799f5c02/disco/strophe.disco.js", "strophe.disco": "https://raw.github.com/jcbrand/strophejs-plugins/75c8693992bc357c699b6d615eeb396e799f5c02/disco/strophe.disco.js",
"strophe.muc": "https://raw.github.com/jcbrand/strophejs-plugins/75c8693992bc357c699b6d615eeb396e799f5c02/muc/strophe.muc.js", "strophe.muc": "https://raw.github.com/jcbrand/strophejs-plugins/75c8693992bc357c699b6d615eeb396e799f5c02/muc/strophe.muc.js",
"otr": "~0.2.1", "otr": "~0.2.1",
"crypto-js": "~3.1.2" "crypto-js": "~3.1.2",
"almond": "~0.2.6"
}, },
"exportsOverride": {} "exportsOverride": {}
} }
({
baseUrl: ".",
name: "components/almond/almond.js",
out: "converse.min.js",
include: ['main'],
paths: {
"jquery": "components/jquery/jquery",
"jed": "components/jed/jed",
"locales": "locale/locales",
"af": "locale/af/LC_MESSAGES/af",
"en": "locale/en/LC_MESSAGES/en",
"de": "locale/de/LC_MESSAGES/de",
"es": "locale/es/LC_MESSAGES/es",
"it": "locale/it/LC_MESSAGES/it",
"pt_BR": "locale/pt_BR/LC_MESSAGES/pt_BR",
"jquery.tinysort": "components/tinysort/src/jquery.tinysort",
"underscore": "components/underscore/underscore",
"backbone": "components/backbone/backbone",
"backbone.localStorage": "components/backbone.localStorage/backbone.localStorage",
"strophe": "components/strophe/strophe",
"strophe.muc": "components/strophe.muc/index",
"strophe.roster": "components/strophe.roster/index",
"strophe.vcard": "components/strophe.vcard/index",
"strophe.disco": "components/strophe.disco/index"
}
})
...@@ -17,10 +17,7 @@ ...@@ -17,10 +17,7 @@
user-select: none; user-select: none;
} }
#collective-xmpp-chat-data { #collective-xmpp-chat-data,
color: rgb(79, 79, 79);
}
#collective-xmpp-chat-data input { #collective-xmpp-chat-data input {
color: rgb(79, 79, 79); color: rgb(79, 79, 79);
} }
...@@ -169,6 +166,10 @@ ul.participant-list li.moderator { ...@@ -169,6 +166,10 @@ ul.participant-list li.moderator {
height:200px; height:200px;
} }
.chatroom .chat-content {
height:200px;
}
.chat-info { .chat-info {
color:#666666; color:#666666;
} }
...@@ -331,7 +332,7 @@ dl.add-converse-contact { ...@@ -331,7 +332,7 @@ dl.add-converse-contact {
float: right; float: right;
clear: right; clear: right;
height: 22px; height: 22px;
padding: 5px 5px 0 0; padding: 0px 5px 0 0;
color: rgb(79, 79, 79); color: rgb(79, 79, 79);
} }
...@@ -384,18 +385,8 @@ a.close-chatbox-button { ...@@ -384,18 +385,8 @@ a.close-chatbox-button {
text-shadow:1px 1px 0 #ffffff; text-shadow:1px 1px 0 #ffffff;
} }
.close-chatbox-button { a.configure-chatroom-button:active,
padding: 0 2px 0 6px; a.close-chatbox-button:active {
}
.close-chatbox-button:hover {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f6f6f6), color-stop(1, #ffffff) );
background:-moz-linear-gradient( center top, #f6f6f6 5%, #ffffff 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#ffffff');
background-color:#f6f6f6;
}
.close-chatbox-button:active {
position:relative; position:relative;
top:1px; top:1px;
} }
...@@ -576,6 +567,7 @@ dd.available-chatroom:hover a.room-info { ...@@ -576,6 +567,7 @@ dd.available-chatroom:hover a.room-info {
} }
#converse-roster a.open-chat { #converse-roster a.open-chat {
line-height: 21px;
width: 85%; width: 85%;
} }
#converse-roster dd:hover a.open-chat { #converse-roster dd:hover a.open-chat {
...@@ -627,7 +619,7 @@ div#controlbox-panes { ...@@ -627,7 +619,7 @@ div#controlbox-panes {
background-color: white; background-color: white;
border-bottom-left-radius: 4px; border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px; border-bottom-right-radius: 4px;
width: 199px; width: 200px;
} }
...@@ -781,6 +773,10 @@ ul.chat-toolbar { ...@@ -781,6 +773,10 @@ ul.chat-toolbar {
height: 20px; height: 20px;
display: block; display: block;
width: 195px; width: 195px;
/* XXX: CHECKME */
float: right;
display: inline-block;
height: 20px;
} }
.chat-toolbar .toggle-otr { .chat-toolbar .toggle-otr {
...@@ -845,6 +841,11 @@ ul.chat-toolbar li { ...@@ -845,6 +841,11 @@ ul.chat-toolbar li {
cursor: pointer; cursor: pointer;
} }
ul.chat-toolbar li:hover {
cursor: pointer;
color: rgb(39, 39, 39);
}
form#set-custom-xmpp-status { form#set-custom-xmpp-status {
float: left; float: left;
padding: 0; padding: 0;
...@@ -860,7 +861,6 @@ form#set-custom-xmpp-status { ...@@ -860,7 +861,6 @@ form#set-custom-xmpp-status {
margin:0; margin:0;
} }
#set-custom-xmpp-status button { #set-custom-xmpp-status button {
padding: 1px 2px 1px 1px; padding: 1px 2px 1px 1px;
} }
...@@ -894,7 +894,7 @@ form.add-xmpp-contact input { ...@@ -894,7 +894,7 @@ form.add-xmpp-contact input {
.chatbox .dropdown dt a span { .chatbox .dropdown dt a span {
cursor:pointer; cursor:pointer;
display:block; display:block;
padding: 2px 7px 0 5px; padding: 4px 7px 0 5px;
color: rgb(79, 79, 79); color: rgb(79, 79, 79);
} }
...@@ -921,7 +921,7 @@ form.add-xmpp-contact input { ...@@ -921,7 +921,7 @@ form.add-xmpp-contact input {
.chatbox .dropdown a { .chatbox .dropdown a {
height: 22px; height: 22px;
display: inline-block; display: inline-block;
padding-top: 2px; line-height: 24px;
} }
.chatbox .dropdown dd ul a:hover { .chatbox .dropdown dd ul a:hover {
......
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
"components/otr/build/otr", "components/otr/build/otr",
"crypto.aes", "crypto.aes",
"locales", "locales",
"localstorage", "backbone.localStorage",
"tinysort", "jquery.tinysort",
"strophe", "strophe",
"strophe.muc", "strophe.muc",
"strophe.roster", "strophe.roster",
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
this.prebind = false; this.prebind = false;
this.show_controlbox_by_default = false; this.show_controlbox_by_default = false;
this.xhr_user_search = false; this.xhr_user_search = false;
this.xhr_custom_status = false;
this.testing = false; // Exposes sensitive data for testing. Never set to true in production systems! this.testing = false; // Exposes sensitive data for testing. Never set to true in production systems!
this.callback = callback || function () {}; this.callback = callback || function () {};
...@@ -72,12 +73,21 @@ ...@@ -72,12 +73,21 @@
'prebind', 'prebind',
'show_controlbox_by_default', 'show_controlbox_by_default',
'xhr_user_search', 'xhr_user_search',
'xhr_custom_status',
'connection', 'connection',
'testing' 'testing',
'jid',
'sid',
'rid'
]; ];
_.extend(this, _.pick(settings, whitelist)); _.extend(this, _.pick(settings, whitelist));
var __ = $.proxy(function (str) { var __ = $.proxy(function (str) {
/* Translation factory
*/
if (this.i18n === undefined) {
this.i18n = locales['en'];
}
var t = this.i18n.translate(str); var t = this.i18n.translate(str);
if (arguments.length>1) { if (arguments.length>1) {
return t.fetch.apply(t, [].slice.call(arguments,1)); return t.fetch.apply(t, [].slice.call(arguments,1));
...@@ -85,6 +95,18 @@ ...@@ -85,6 +95,18 @@
return t.fetch(); return t.fetch();
} }
}, this); }, this);
var ___ = function (str) {
/* XXX: This is part of a hack to get gettext to scan strings to be
* translated. Strings we cannot send to the function above because
* they require variable interpolation and we don't yet have the
* variables at scan time.
*
* See actionInfoMessages
*/
return str;
};
this.msg_counter = 0; this.msg_counter = 0;
this.autoLink = function (text) { this.autoLink = function (text) {
// Convert URLs into hyperlinks // Convert URLs into hyperlinks
...@@ -1591,22 +1613,20 @@ ...@@ -1591,22 +1613,20 @@
}, },
actionInfoMessages: { actionInfoMessages: {
// # For translations: %1$s will be replaced with the user's nickname /* XXX: Note the triple underscore function and not double
// # Don't translate "strong" * underscore.
// # Example: <strong>jcbrand</strong> has been banned *
301: converse.i18n.translate('<strong>%1$s</strong> has been banned'), * This is a hack. We can't pass the strings to __ because we
// # For translations: %1$s will be replaced with the user's nickname * don't yet know what the variable to interpolate is.
// # Don't translate "strong" *
// # Example: <strong>jcbrand</strong> has been kicked out * Triple underscore will just return the string again, but we
307: converse.i18n.translate('<strong>%1$s</strong> has been kicked out'), * can then at least tell gettext to scan for it so that these
// # For translations: %1$s will be replaced with the user's nickname * strings are picked up by the translation machinery.
// # Don't translate "strong" */
// # Example: <strong>jcbrand</strong> has been removed because of an affiliasion change 301: ___("<strong>%1$s</strong> has been banned"),
321: converse.i18n.translate("<strong>%1$s</strong> has been removed because of an affiliation change"), 307: ___("<strong>%1$s</strong> has been kicked out"),
// # For translations: %1$s will be replaced with the user's nickname 321: ___("<strong>%1$s</strong> has been removed because of an affiliation change"),
// # Don't translate "strong" 322: ___("<strong>%1$s</strong> has been removed for not being a member")
// # Example: <strong>jcbrand</strong> has been removed for not being a member
322: converse.i18n.translate("<strong>%1$s</strong> has been removed for not being a member")
}, },
disconnectMessages: { disconnectMessages: {
...@@ -1638,9 +1658,8 @@ ...@@ -1638,9 +1658,8 @@
info_msgs.push(this.infoMessages[stat]); info_msgs.push(this.infoMessages[stat]);
} else if (_.contains(_.keys(this.actionInfoMessages), stat)) { } else if (_.contains(_.keys(this.actionInfoMessages), stat)) {
action_msgs.push( action_msgs.push(
this.actionInfoMessages[stat].fetch( __(this.actionInfoMessages[stat], Strophe.unescapeNode(Strophe.getResourceFromJid($el.attr('from'))))
Strophe.unescapeNode(Strophe.getResourceFromJid($el.attr('from'))) );
));
} }
} }
} }
...@@ -1995,13 +2014,14 @@ ...@@ -1995,13 +2014,14 @@
}, },
template: _.template( template: _.template(
'<a class="open-chat" title="'+__('Click to chat with this contact')+'" href="#">{{ fullname }}</a>' + '<a class="open-chat" title="'+__('Click to chat with this contact')+'" href="#">'+
'<span class="icon-{{ chat_status }}" title="{{ status_desc }}"></span>'+ '<span class="icon-{{ chat_status }}" title="{{ status_desc }}"></span>{{ fullname }}'+
'<a class="remove-xmpp-contact" title="'+__('Click to remove this contact')+'" href="#"></a>'), '</a>' +
'<a class="remove-xmpp-contact icon-remove" title="'+__('Click to remove this contact')+'" href="#"></a>'),
pending_template: _.template( pending_template: _.template(
'<span>{{ fullname }}</span>' + '<span>{{ fullname }}</span>' +
'<a class="remove-xmpp-contact" title="'+__('Click to remove this contact')+'" href="#"></a>'), '<a class="remove-xmpp-contact icon-remove" title="'+__('Click to remove this contact')+'" href="#"></a>'),
request_template: _.template('<div>{{ fullname }}</div>' + request_template: _.template('<div>{{ fullname }}</div>' +
'<button type="button" class="accept-xmpp-request">' + '<button type="button" class="accept-xmpp-request">' +
...@@ -2024,6 +2044,12 @@ ...@@ -2024,6 +2044,12 @@
this.$el.html(this.request_template(item.toJSON())); this.$el.html(this.request_template(item.toJSON()));
converse.showControlBox(); converse.showControlBox();
} else if (subscription === 'both' || subscription === 'to') { } else if (subscription === 'both' || subscription === 'to') {
_.each(['pending-xmpp-contact', 'requesting-xmpp-contact'],
function (cls) {
if (this.el.className.indexOf(cls) !== -1) {
this.$el.removeClass(cls);
}
}, this);
this.$el.addClass('current-xmpp-contact'); this.$el.addClass('current-xmpp-contact');
var status_desc = { var status_desc = {
'dnd': 'This contact is busy', 'dnd': 'This contact is busy',
...@@ -2391,7 +2417,8 @@ ...@@ -2391,7 +2417,8 @@
var $my_contacts = this.$el.find('#xmpp-contacts'), var $my_contacts = this.$el.find('#xmpp-contacts'),
$contact_requests = this.$el.find('#xmpp-contact-requests'), $contact_requests = this.$el.find('#xmpp-contact-requests'),
$pending_contacts = this.$el.find('#pending-xmpp-contacts'), $pending_contacts = this.$el.find('#pending-xmpp-contacts'),
$count, presence_change; sorted = false,
$count, changed_presence;
if (item) { if (item) {
var jid = item.id, var jid = item.id,
view = this.rosteritemviews[item.id], view = this.rosteritemviews[item.id],
...@@ -2406,44 +2433,37 @@ ...@@ -2406,44 +2433,37 @@
$contact_requests.after(view.render().el); $contact_requests.after(view.render().el);
$contact_requests.after($contact_requests.siblings('dd.requesting-xmpp-contact').tsort(crit)); $contact_requests.after($contact_requests.siblings('dd.requesting-xmpp-contact').tsort(crit));
} else if (subscription === 'both' || subscription === 'to') { } else if (subscription === 'both' || subscription === 'to') {
if (!item.get('sorted')) { if ($.contains(document.documentElement, view.el)) {
// this attribute will be true only after all of the elements have been added on the page
// at this point all offline
$my_contacts.after(view.render().el);
}
else {
// just by calling render will be enough to change the icon of the existing item without
// having to reinsert it and the sort will come from the presence change
view.render(); view.render();
} else {
$my_contacts.after(view.render().el);
} }
} }
presence_change = view.model.changed.chat_status; changed_presence = view.model.changed.chat_status;
if (presence_change) { if (changed_presence) {
// resort all items only if the model has changed it's chat_status as this render this.sortRoster(changed_presence)
// is also triggered when the resource is changed which always comes before the presence change sorted = true;
// therefore we avoid resorting when the change doesn't affect the position of the item }
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.offline').tsort('a', crit)); if (item.get('is_last')) {
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.unavailable').tsort('a', crit)); if (!sorted) {
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.away').tsort('a', crit)); this.sortRoster(item.get('chat_status'));
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.dnd').tsort('a', crit)); }
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.online').tsort('a', crit)); if (!this.$el.is(':visible')) {
} // Once all initial roster items have been added, we
// can show the roster.
if (item.get('is_last') && !item.get('sorted')) { this.$el.show();
// this will be true after all of the roster items have been added with the default }
// options where all of the items are offline and now we can show the rosterView
item.set('sorted', true);
this.initialSort();
this.$el.show();
converse.xmppstatus.sendPresence(); converse.xmppstatus.sendPresence();
} }
} }
// Hide the headings if there are no contacts under them // Hide the headings if there are no contacts under them
_.each([$my_contacts, $contact_requests, $pending_contacts], function (h) { _.each([$my_contacts, $contact_requests, $pending_contacts], function (h) {
if (h.nextUntil('dt').length) { if (h.nextUntil('dt').length) {
h.show(); if (!h.is(':visible')) {
h.show();
}
} }
else { else if (h.is(':visible')) {
h.hide(); h.hide();
} }
}); });
...@@ -2455,11 +2475,14 @@ ...@@ -2455,11 +2475,14 @@
return this; return this;
}, },
initialSort: function () { sortRoster: function (chat_status) {
var $my_contacts = this.$el.find('#xmpp-contacts'), var $my_contacts = this.$el.find('#xmpp-contacts');
crit = {order:'asc'}; $my_contacts.siblings('dd.current-xmpp-contact.'+chat_status).tsort('a', {order:'asc'});
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.offline').tsort('a', crit)); $my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.offline'));
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.unavailable').tsort('a', crit)); $my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.unavailable'));
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.away'));
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.dnd'));
$my_contacts.after($my_contacts.siblings('dd.current-xmpp-contact.online'));
} }
}); });
...@@ -2517,6 +2540,13 @@ ...@@ -2517,6 +2540,13 @@
setStatusMessage: function (status_message) { setStatusMessage: function (status_message) {
converse.connection.send($pres().c('show').t(this.get('status')).up().c('status').t(status_message)); converse.connection.send($pres().c('show').t(this.get('status')).up().c('status').t(status_message));
this.save({'status_message': status_message}); this.save({'status_message': status_message});
if (this.xhr_custom_status) {
$.ajax({
url: 'set-custom-status',
type: 'POST',
data: {'msg': status_message}
});
}
} }
}); });
...@@ -2548,7 +2578,7 @@ ...@@ -2548,7 +2578,7 @@
'<span class="icon-{{ chat_status }}"></span>'+ '<span class="icon-{{ chat_status }}"></span>'+
'{{ status_message }}' + '{{ status_message }}' +
'</a>' + '</a>' +
'<a class="change-xmpp-status-message" href="#" title="'+__('Click here to write a custom status message')+'"></a>' + '<a class="change-xmpp-status-message icon-pencil" href="#" title="'+__('Click here to write a custom status message')+'"></a>' +
'</div>'), '</div>'),
renderStatusChangeForm: function (ev) { renderStatusChangeForm: function (ev) {
...@@ -2836,9 +2866,8 @@ ...@@ -2836,9 +2866,8 @@
if (this.debug) { if (this.debug) {
this.connection.xmlInput = function (body) { console.log(body); }; this.connection.xmlInput = function (body) { console.log(body); };
this.connection.xmlOutput = function (body) { console.log(body); }; this.connection.xmlOutput = function (body) { console.log(body); };
Strophe.log = function (level, msg) { Strophe.log = function (level, msg) { console.log(level+' '+msg); };
console.log(level+' '+msg); Strophe.error = function (msg) { console.log('ERROR: '+msg); };
};
} }
this.bare_jid = Strophe.getBareJidFromJid(this.connection.jid); this.bare_jid = Strophe.getBareJidFromJid(this.connection.jid);
this.domain = Strophe.getDomainFromJid(this.connection.jid); this.domain = Strophe.getDomainFromJid(this.connection.jid);
......
...@@ -9,4 +9,4 @@ ...@@ -9,4 +9,4 @@
* *
* Copyright (c) 2012, Jan-Carel Brand <jc@opkode.com> * Copyright (c) 2012, Jan-Carel Brand <jc@opkode.com>
* Dual licensed under the MIT and GPL Licenses * Dual licensed under the MIT and GPL Licenses
*/.hidden{display:none}.locked{background:url(images/emblem-readonly.png) no-repeat right;padding-right:22px}span.spinner{background:url(images/spinner.gif) no-repeat center;width:22px;height:22px;padding:0 2px;display:block}span.spinner.centered{position:absolute;top:30%;left:50%;margin:0 0 0 -25%}span.spinner.hor_centered{left:40%;position:absolute}#chatpanel{z-index:99;position:fixed;bottom:0;right:0;height:332px;width:auto}#toggle-controlbox{position:fixed;font-size:80%;bottom:0;right:0;border-top-right-radius:4px;border-top-left-radius:4px;background:#e3e2e2;border:1px solid #c3c3c3;border-bottom:0;padding:.25em .5em;margin-right:1em;height:1.1em}#connecting-to-chat{background:url(images/spinner.gif) no-repeat left;padding-left:1.4em}.chat-head{color:#fff;margin:0;font-size:100%;border-top-right-radius:4px;border-top-left-radius:4px;padding:3px 0 3px 7px}.chat-head-chatbox{background-color:#596a72;background-color:rgba(89,106,114,1)}.chat-head-chatroom{background-color:#2D617A}.chatroom .chat-body{height:272px;background-color:#fff;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.chatroom .chat-area{float:left;width:200px}.chatroom .chat{overflow:auto;height:400px;border:solid 1px #ccc}.chatroom .participants{float:left;width:99px;height:272px;background-color:#fff;overflow:auto;border-right:1px solid #999;border-bottom:1px solid #999;border-bottom-right-radius:4px}.participants ul.participant-list li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;font-size:12px;padding:.5em 0 0 .5em;cursor:default}ul.participant-list li.moderator{color:#FE0007}.chatroom form.sendXMPPMessage{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.chatroom .participant-list{list-style:none}.chat-blink{background-color:#176689;border-right:1px solid #176689;border-left:1px solid #176689}.chat-content{padding:.3em;font-size:13px;color:#333;height:193px;overflow-y:auto;border:1px solid #999;border-bottom:0;border-top:0;background-color:#fff;line-height:1.3em}.chat-textarea{border:0;height:50px}.chat-textarea-chatbox-selected{border:1px solid #578308;margin:0}.chat-textarea-chatroom-selected{border:2px solid #2D617A;margin:0}.chat-info{color:#666}.chat-message-room,.chat-message-them,.chat-message-me{font-weight:700;white-space:nowrap;max-width:100px;text-overflow:ellipsis;overflow:hidden;display:inline-block;float:left;padding-right:3px}.chat-message-them{color:#F62817}.chat-message-me{color:#436976}.chat-message-room{color:#4B7003}.chat-event,.chat-date,.chat-info{color:gray}li.chat-info{padding-left:10px}.chat-date{display:inline-block;padding-top:10px}div#settings,div#chatrooms,div#login-dialog{height:272px}p.not-implemented{margin-top:3em;margin-left:.3em;color:gray}div.delayed .chat-message-them{color:#FB5D50}div.delayed .chat-message-me{color:#7EABBB}input.error{border:1px solid red}.conn-feedback.error{color:red}.chat-message-error{color:#76797C;font-size:90%;font-weight:400}.chat-head .avatar{float:left;margin-right:6px}div.chat-title{color:#fff;font-weight:700;line-height:15px;display:block;margin-top:2px;margin-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:rgba(0,0,0,.51) 0 -1px 0;height:1em}.chat-head-chatbox,.chat-head-chatroom{background:linear-gradient(top,rgba(206,220,231,1) 0,rgba(89,106,114,1) 100%);height:35px;position:relative}p.user-custom-message,p.chatroom-topic{font-size:80%;font-style:italic;height:1.3em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0}.activated{display:block!important}a.subscribe-to-user{padding-left:2em;font-weight:700}dl.add-converse-contact{margin:0 0 0 .5em}.fancy-dropdown{border:1px solid #ddd;height:22px}.fancy-dropdown a.choose-xmpp-status,.fancy-dropdown a.toggle-xmpp-contact-form{text-shadow:0 1px 0 rgba(255,255,255,1);padding-left:2em;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;float:left;width:130px}#fancy-xmpp-status-select a.change-xmpp-status-message{background:url(images/pencil_icon.png) no-repeat right 3px;float:right;clear:right;height:22px}ul#found-users{padding:10px 0 5px 5px;border:0}form.search-xmpp-contact{margin:0;padding-left:5px;padding:0 0 5px 5px}form.search-xmpp-contact input{width:8em}.oc-chat-head{margin:0;color:#FFF;border-top-right-radius:4px;border-top-left-radius:4px;height:35px;clear:right;background-color:#5390C8;padding:3px 0 0}a.configure-chatroom-button,a.close-chatbox-button{margin-top:.2em;margin-right:.5em;cursor:pointer;float:right;width:12px;-moz-box-shadow:inset 0 1px 0 0 #fff;-webkit-box-shadow:inset 0 1px 0 0 #fff;box-shadow:inset 0 1px 0 0 #fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0.05,#fff),color-stop(1,#f6f6f6));background:-moz-linear-gradient(center top,#fff 5%,#f6f6f6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f6f6f6');-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;border:1px solid #888;display:inline-block;color:#666!important;font-family:arial;font-size:12px;font-weight:700;text-decoration:none;text-shadow:1px 1px 0 #fff}a.configure-chatroom-button{padding:0 4px;background:#fff url(images/preferences-system.png) no-repeat center center}.close-chatbox-button{padding:0 2px 0 6px}.close-chatbox-button:hover{background:-webkit-gradient(linear,left top,left bottom,color-stop(0.05,#f6f6f6),color-stop(1,#fff));background:-moz-linear-gradient(center top,#f6f6f6 5%,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#ffffff');background-color:#f6f6f6}.close-chatbox-button:active{position:relative;top:1px}.oc-chat-content dt{margin:0;padding-top:.5em}.chatroom-form-container{color:#666;padding:5px;height:262px;overflow-y:auto;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.chatroom-form{background:#fff;font-size:12px;padding:0}.chat-body p{font-size:14px;color:#666;padding:5px;margin:0}.chatroom-form legend{font-size:14px;font-weight:700;margin-bottom:5px}.chatroom-form label{font-weight:700;display:block;clear:both}.chatroom-form label input,.chatroom-form label select{float:right}#converse-roster dd.odd{background-color:#DCEAC5}#converse-roster dd.current-xmpp-contact{clear:both}#converse-roster dd.current-xmpp-contact,#converse-roster dd.current-xmpp-contact:hover{background:url(images/user_online_panel.png) no-repeat 5px 2px}#converse-roster dd.current-xmpp-contact.offline:hover,#converse-roster dd.current-xmpp-contact.unavailable:hover,#converse-roster dd.current-xmpp-contact.offline,#converse-roster dd.current-xmpp-contact.unavailable{background:url(images/user_offline_panel.png) no-repeat 5px 2px}#converse-roster dd.current-xmpp-contact.dnd,#converse-roster dd.current-xmpp-contact.dnd:hover{background:url(images/user_busy_panel.png) no-repeat 5px 2px}#converse-roster dd.current-xmpp-contact.xa,#converse-roster dd.current-xmpp-contact.xa:hover,#converse-roster dd.current-xmpp-contact.away,#converse-roster dd.current-xmpp-contact.away:hover{background:url(images/user_away_panel.png) no-repeat 5px 2px}#converse-roster dd.requesting-xmpp-contact button{margin-left:.5em}#converse-roster dd a,#converse-roster dd span{text-shadow:0 1px 0 rgba(250,250,250,1);display:inline-block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#converse-roster dd a{margin-left:1.3em}#converse-roster dd span{width:125px}.remove-xmpp-contact-dialog .ui-dialog-buttonpane{border:0}#converse-roster{height:200px;overflow-y:auto;overflow-x:hidden;width:100%;margin:0;position:relative;top:0;border:0;margin-top:.5em}#available-chatrooms dd{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;width:165px}#available-chatrooms dt,#converse-roster dt{font-weight:400;font-size:13px;color:#666;border:0;padding:0 0 .3em .5em;text-shadow:0 1px 0 rgba(250,250,250,1)}#converse-roster dt{display:none}dd.available-chatroom,#converse-roster dd{font-weight:700;border:0;display:block;padding:0 0 0 .5em;color:#666;text-shadow:0 1px 0 rgba(250,250,250,1)}.room-info{font-size:11px;font-style:normal;font-weight:400}li.room-info{display:block;margin-left:5px}div.room-info{clear:left}p.room-info{margin:0;padding:0;display:block;white-space:normal}a.room-info{background:url(images/information.png) no-repeat right top;width:22px;height:22px;float:right;display:none;clear:right}a.open-room{float:left;white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden}dd.available-chatroom:hover a.room-info{display:inline-block}dd.available-chatroom:hover a.open-room{width:75%}#converse-roster dd a.remove-xmpp-contact{background:url(images/delete_icon.png) no-repeat right top;padding:0 0 1em;float:right;width:22px;margin:0;display:none}#converse-roster dd:hover a.remove-xmpp-contact{display:inline-block}#converse-roster dd:hover a.open-chat{width:75%}.chatbox,.chatroom{box-shadow:1px 1px 5px 1px rgba(0,0,0,.4);display:none;float:right;margin-right:15px;z-index:20;border-radius:4px}.chatbox{width:201px}.chatroom{width:300px;height:311px}.oc-chat-content{height:272px;width:199px;padding:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.oc-chat-content dd{margin-left:0;margin-bottom:0;padding:1em}.oc-chat-content dd.odd{background-color:#DCEAC5}div#controlbox-panes{background:-moz-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-ms-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-o-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(255,255,255,1)),color-stop(100%,rgba(240,240,240,1)));background:-webkit-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border:1px solid #999;width:199px}form#converse-login{background:#fff;padding:2em 0 .3em .5em}form#converse-login input{display:block;width:90%}form#converse-login .login-submit{margin-top:1em;width:auto}form.set-xmpp-status{background:0;padding:.5em 0 .5em .5em}form.add-chatroom{background:0;padding:3px}form.add-chatroom input[type=text]{width:95%;margin:3px}form.add-chatroom input[type=button],form.add-chatroom input[type=submit]{width:50%}select#select-xmpp-status{float:right;margin-right:.5em}.chat-head #controlbox-tabs{text-align:center;display:inline;overflow:hidden;font-size:12px;list-style-type:none}.chat-head #controlbox-tabs li{float:left;list-style:none;padding-left:0;text-shadow:#fff 0 1px 0;width:40%}ul#controlbox-tabs li a{display:block;font-size:12px;height:34px;line-height:34px;margin:0;text-align:center;text-decoration:none;border:1px solid #999;border-top-right-radius:4px;border-top-left-radius:4px;color:#666;text-shadow:0 1px 0 rgba(250,250,250,1)}.chat-head #controlbox-tabs li a:hover{color:#000}.chat-head #controlbox-tabs li a{background-color:#fff;box-shadow:inset 0 0 8px rgba(0,0,0,.2)}ul#controlbox-tabs a.current,ul#controlbox-tabs a.current:hover{box-shadow:none;color:#000;border-bottom:0;height:35px}div#users,div#chatrooms,div#login-dialog,div#settings{border:0;font-size:14px;width:199px;background-color:#fff;border-bottom-right-radius:4px;border-bottom-left-radius:4px}div#chatrooms{overflow-y:auto}form.sendXMPPMessage{background:#fff;border:1px solid #999;padding:.5em;margin:0;position:relative;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;border-top-left-radius:0;border-top-right-radius:0;height:54px}form#set-custom-xmpp-status{float:left;padding:0}#set-custom-xmpp-status button{padding:1px 2px 1px 1px}.chatbox dl.dropdown{margin-right:.5em;margin-bottom:0;background-color:#f0f0f0}.chatbox .dropdown dd,.dropdown dt,.dropdown ul{margin:0;padding:0}.chatbox .dropdown dd{position:relative}input.custom-xmpp-status{width:138px}form.add-xmpp-contact{background:0;padding:5px}form.add-xmpp-contact input{width:125px}.chatbox .dropdown dt a span{cursor:pointer;display:block;padding:5px}.chatbox .dropdown dd ul{padding:5px 0;list-style:none;position:absolute;left:0;top:0;border:1px solid #ddd;border-top:0;width:99%;z-index:21;background-color:#f0f0f0}.chatbox .dropdown li{list-style:none;padding-left:0}.set-xmpp-status .dropdown dd ul{z-index:22}.chatbox .dropdown a{padding:3px 0 0 25px;display:block;height:22px}.chatbox .dropdown a.toggle-xmpp-contact-form{background:url(images/add_icon.png) no-repeat 4px 2px}.chatbox .dropdown a.online{background:url(images/user_online_panel.png) no-repeat 3px 4px}.chatbox .dropdown a.offline{background:url(images/user_offline_panel.png) no-repeat 3px 4px}.chatbox .dropdown a.dnd{background:url(images/user_busy_panel.png) no-repeat 3px 4px}.chatbox .dropdown a.away{background:url(images/user_away_panel.png) no-repeat 3px 4px}.chatbox .dropdown dd ul a:hover{background-color:#bed6e5} */@font-face{font-family:Converse-js;src:url(fonticons/fonts/Converse-js.eot)}@font-face{font-family:Converse-js;src:url(data:application/font-woff;charset=utf-8;base64,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) format('woff'),url(data:application/x-font-ttf;charset=utf-8;base64,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aTI1RkMHdW5pMjVGQgd1bmlFMDE1B3VuaUUwMTYHdW5pRTAxNwd1bmlFMDFBB3VuaUUwMUIHdW5pRTAxRAd1bmkyMzFCB3VuaUUwMjEHdW5pRTAyMgd1bmlFMDI0B3VuaUUwMjUHdW5pRTAyNgd1bmlFMDI3B3VuaUUwMjgHdW5pRTAyOQd1bmlFMDJBB3VuaUUwMkIHdW5pRTAyRgd1bmlFMDJEB3VuaUUwMkUHdW5pRTAzMAd1bmlFMDMxB3VuaUUwMzIHdW5pRTAzMwd1bmkyNzY0DGludnNtaWxlZmFjZQd1bmkyNjFECXNtaWxlZmFjZQd1bmlFMDM4B3VuaTI2MzkHdW5pRTAzQQd1bmkyMzY5B3VuaTIzNjgHdW5pMjM2NAd1bmkyNjFGB3VuaUUwM0YHdW5pRTA0MAd1bmlFMDQxB3VuaTIzNjAHdW5pRTAxRgd1bmkyNkEwB3VuaUUwNDUHdW5pRTA0Ngd1bmlFMDQ3B3VuaUUwNDgHdW5pRTA0OQd1bmlFMDRBB3VuaUUwNEIHdW5pRTA0Qwd1bmlFMDREB3VuaUUwNEUHdW5pRTA0Rgd1bmlFMDUwB3VuaUUwNTMHdW5pRTA1NQd1bmkyNzE1B3VuaTI3MTgHdW5pRTA1OAd1bmlFMDVBB3VuaTI3MUEHdW5pMjYxMQd1bmkyQjI3B3VuaTJCMjgHdW5pMkIyNgd1bmkyQjI1B3VuaUUwNTkHdW5pRTAwMQd1bmkyQjE0B3VuaUUwMDIHdW5pRTAwNAAAAAH//wACAAEAAAAOAAAAGAAAAAAAAgABAAMAWAABAAQAAAACAAAAAAABAAAAAMmJbzEAAAAAzjKxmwAAAADOMrGb) format('truetype');font-weight:400;font-style:normal}[data-icon]:before{font-family:Converse-js;content:attr(data-icon);speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased}.icon-home,.icon-pencil,.icon-camera,.icon-camera-2,.icon-play,.icon-music,.icon-headphones,.icon-phone,.icon-phone-hang-up,.icon-address-book,.icon-notebook,.icon-envelop,.icon-pushpin,.icon-online,.icon-away,.icon-bubbles,.icon-bubbles-2,.icon-bubbles-3,.icon-user,.icon-users,.icon-quotes-left,.icon-spinner,.icon-search,.icon-cogs,.icon-wrench,.icon-unlocked,.icon-lock,.icon-lock-2,.icon-key,.icon-key-2,.icon-zoom-out,.icon-zoom-in,.icon-cog,.icon-remove,.icon-remove-2,.icon-eye,.icon-eye-blocked,.icon-attachment,.icon-globe,.icon-heart,.icon-happy,.icon-thumbs-up,.icon-smiley,.icon-tongue,.icon-sad,.icon-wink,.icon-wondering,.icon-confused,.icon-shocked,.icon-evil,.icon-angry,.icon-cool,.icon-grin,.icon-info,.icon-notification,.icon-warning,.icon-spell-check,.icon-volume-high,.icon-volume-medium,.icon-volume-low,.icon-volume-mute,.icon-volume-mute-2,.icon-volume-decrease,.icon-volume-increase,.icon-bold,.icon-underline,.icon-italic,.icon-strikethrough,.icon-new-tab,.icon-youtube,.icon-close,.icon-blocked,.icon-cancel-circle,.icon-minus,.icon-plus,.icon-checkbox-checked,.icon-checkbox-unchecked,.icon-checkbox-partial,.icon-radio-checked,.icon-radio-unchecked,.icon-room-info,.icon-newspaper,.icon-image,.icon-offline,.icon-dnd{font-family:Converse-js;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased}.icon-home:before{content:"\e000"}.icon-pencil:before{content:"\270e"}.icon-camera:before{content:"\e003"}.icon-camera-2:before{content:"\2616"}.icon-play:before{content:"\25d9"}.icon-music:before{content:"\266b"}.icon-headphones:before{content:"\266c"}.icon-phone:before{content:"\260f"}.icon-phone-hang-up:before{content:"\260e"}.icon-address-book:before{content:"\270f"}.icon-notebook:before{content:"\2710"}.icon-envelop:before{content:"\2709"}.icon-pushpin:before{content:"\e012"}.icon-online:before{content:"\25fc"}.icon-away:before{content:"\25fb"}.icon-bubbles:before{content:"\e015"}.icon-bubbles-2:before{content:"\e016"}.icon-bubbles-3:before{content:"\e017"}.icon-user:before{content:"\e01a"}.icon-users:before{content:"\e01b"}.icon-quotes-left:before{content:"\e01d"}.icon-spinner:before{content:"\231b"}.icon-search:before{content:"\e021"}.icon-cogs:before{content:"\e022"}.icon-wrench:before{content:"\e024"}.icon-unlocked:before{content:"\e025"}.icon-lock:before{content:"\e026"}.icon-lock-2:before{content:"\e027"}.icon-key:before{content:"\e028"}.icon-key-2:before{content:"\e029"}.icon-zoom-out:before{content:"\e02a"}.icon-zoom-in:before{content:"\e02b"}.icon-cog:before{content:"\e02f"}.icon-remove:before{content:"\e02d"}.icon-remove-2:before{content:"\e02e"}.icon-eye:before{content:"\e030"}.icon-eye-blocked:before{content:"\e031"}.icon-attachment:before{content:"\e032"}.icon-globe:before{content:"\e033"}.icon-heart:before{content:"\2764"}.icon-happy:before{content:"\263b"}.icon-thumbs-up:before{content:"\261d"}.icon-smiley:before{content:"\263a"}.icon-tongue:before{content:"\e038"}.icon-sad:before{content:"\2639"}.icon-wink:before{content:"\e03a"}.icon-wondering:before{content:"\2369"}.icon-confused:before{content:"\2368"}.icon-shocked:before{content:"\2364"}.icon-evil:before{content:"\261f"}.icon-angry:before{content:"\e03f"}.icon-cool:before{content:"\e040"}.icon-grin:before{content:"\e041"}.icon-info:before{content:"\2360"}.icon-notification:before{content:"\e01f"}.icon-warning:before{content:"\26a0"}.icon-spell-check:before{content:"\e045"}.icon-volume-high:before{content:"\e046"}.icon-volume-medium:before{content:"\e047"}.icon-volume-low:before{content:"\e048"}.icon-volume-mute:before{content:"\e049"}.icon-volume-mute-2:before{content:"\e04a"}.icon-volume-decrease:before{content:"\e04b"}.icon-volume-increase:before{content:"\e04c"}.icon-bold:before{content:"\e04d"}.icon-underline:before{content:"\e04e"}.icon-italic:before{content:"\e04f"}.icon-strikethrough:before{content:"\e050"}.icon-new-tab:before{content:"\e053"}.icon-youtube:before{content:"\e055"}.icon-close:before{content:"\2715"}.icon-blocked:before{content:"\2718"}.icon-cancel-circle:before{content:"\e058"}.icon-minus:before{content:"\e05a"}.icon-plus:before{content:"\271a"}.icon-checkbox-checked:before{content:"\2611"}.icon-checkbox-unchecked:before{content:"\2b27"}.icon-checkbox-partial:before{content:"\2b28"}.icon-radio-checked:before{content:"\2b26"}.icon-radio-unchecked:before{content:"\2b25"}.icon-room-info:before{content:"\e059"}.icon-newspaper:before{content:"\e001"}.icon-image:before{content:"\2b14"}.icon-offline:before{content:"\e002"}.icon-dnd:before{content:"\e004"}#collective-xmpp-chat-data,#collective-xmpp-chat-data input{color:#4f4f4f}.hidden{display:none}.locked{padding-right:22px}span.spinner{background:url(images/spinner.gif) no-repeat center;width:22px;height:22px;padding:0 2px;display:block}span.spinner.centered{position:absolute;top:30%;left:50%;margin:0 0 0 -25%}span.spinner.hor_centered{left:40%;position:absolute}#chatpanel{z-index:99;position:fixed;bottom:0;right:0;height:332px;width:auto}#toggle-controlbox{position:fixed;font-size:70%;bottom:0;right:0;border-top-right-radius:4px;border-top-left-radius:4px;background:#e3e2e2;border:1px solid #c3c3c3;border-bottom:0;padding:1px 3px;margin-right:15px;height:16px}#connecting-to-chat{background:url(images/spinner.gif) no-repeat left;padding-left:1.4em}.chat-head{color:#fff;margin:0;font-size:100%;border-top-right-radius:4px;border-top-left-radius:4px;padding:3px 0 0 3px}.chat-head-chatbox{background-color:#4f6a72;background-color:rgba(79,106,114,1)}.chat-head-chatroom{background-color:#2D617A}.chatroom .chat-body{height:274px;background-color:#fff;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:0}.chatroom .chat-area{float:left;width:200px}.chatroom .chat{overflow:auto;height:400px}.chatroom .participants{float:left;overflow:auto;border-left:1px solid #AAA;max-width:98px;height:274px;background-color:#fff;overflow:auto;border-left:1px solid #AAA;border-bottom-right-radius:4px}.participants ul.participant-list li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;font-size:12px;padding:.5em 0 0 .5em;cursor:default}ul.participant-list li.moderator{color:#FE0007}.chatroom .participant-list{list-style:none}.chat-blink{background-color:#176679;border-right:1px solid #176679;border-left:1px solid #176679}.chat-content{padding:.3em;font-size:13px;color:#4f4f4f;height:200px;width:192px;overflow-y:auto;border:0;background-color:#fff;line-height:1.3em}.chat-textarea{border:0;height:50px}.chat-textarea-chatbox-selected{border:1px solid #578308;margin:0}.chat-textarea-chatroom-selected{border:2px solid #2D617A;margin:0}.chatroom .chat-content{height:200px}.chat-info{color:#666}.chat-message-room,.chat-message-them,.chat-message-me{font-weight:700;white-space:nowrap;max-width:100px;text-overflow:ellipsis;overflow:hidden;display:inline-block;float:left;padding-right:3px}.chat-message-content{word-wrap:break-word}.chat-message-them{color:#F62817}.chat-message-me{color:#436976}.chat-message-room{color:#4B7003}.chat-event,.chat-date,.chat-info{color:gray}li.chat-info{padding-left:10px}.chat-date{display:inline-block;padding-top:10px}div#settings,div#chatrooms,div#login-dialog{height:274px}p.not-implemented{margin-top:3em;margin-left:.3em;color:gray}div.delayed .chat-message-them{color:#FB5D50}div.delayed .chat-message-me{color:#7EABBB}input.error{border:1px solid red}.conn-feedback.error{color:red}.chat-message-error{color:#76797C;font-size:90%;font-weight:400}.chat-head .avatar{float:left;margin-right:6px}div.chat-title{color:#fff;font-weight:700;line-height:15px;display:block;margin-top:2px;margin-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:rgba(0,0,0,.51) 0 -1px 0;height:1em}.chat-head-chatbox,.chat-head-chatroom{background:linear-gradient(top,rgba(206,220,231,1) 0,rgba(79,106,114,1) 100%);height:35px;position:relative}p.user-custom-message,p.chatroom-topic{font-size:80%;font-style:italic;height:1.3em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0}.activated{display:block!important}a.subscribe-to-user{padding-left:2em;font-weight:700}dl.add-converse-contact{margin:0 0 0 .5em}.fancy-dropdown{border:1px solid #ddd;height:22px}.fancy-dropdown a.choose-xmpp-status{width:155px}.fancy-dropdown a.choose-xmpp-status,.fancy-dropdown a.toggle-xmpp-contact-form{text-shadow:0 1px 0 rgba(255,255,255,1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline}.fancy-dropdown a.toggle-xmpp-contact-form span{float:left}.choose-xmpp-status span{padding-right:5px;padding-left:5px;float:left}#fancy-xmpp-status-select a.change-xmpp-status-message{float:right;clear:right;height:22px;padding:5px 5px 0 0;color:#4f4f4f}ul#found-users{padding:10px 0 5px 5px;border:0}form.search-xmpp-contact{margin:0;padding-left:5px;padding:0 0 5px 5px}form.search-xmpp-contact input{width:8em}.oc-chat-head{margin:0;color:#FFF;border-top-right-radius:4px;border-top-left-radius:4px;height:35px;clear:right;background-color:#5390C8;padding:3px 0 0}a.configure-chatroom-button,a.close-chatbox-button{font-size:10px;padding:3px 3px 2px;margin-right:3px;cursor:pointer;float:right;-moz-box-shadow:inset 0 1px 0 0 #fff;-webkit-box-shadow:inset 0 1px 0 0 #fff;box-shadow:inset 0 1px 0 0 #fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0.05,#fff),color-stop(1,#f6f6f6));background:-moz-linear-gradient(center top,#fff 5%,#f6f6f6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f6f6f6');-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;border:1px solid #888;display:inline-block;color:#666!important;text-decoration:none;text-shadow:1px 1px 0 #fff}a.configure-chatroom-button:active,a.close-chatbox-button:active{position:relative;top:1px}.oc-chat-content dt{margin:0;padding-top:.5em}.chatroom-form-container{color:#666;padding:5px;height:262px;overflow-y:auto;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.chatroom-form{background:#fff;font-size:12px;padding:10px 5px}.chat-body p{font-size:14px;color:#666;padding:5px;margin:0}.chatroom-form legend{font-size:14px;font-weight:700;margin-bottom:5px}.chatroom-form label{font-weight:700;display:block;clear:both}.chatroom-form label input,.chatroom-form label select{float:right}#converse-roster dd.odd{background-color:#DCEAC5}#converse-roster dd.current-xmpp-contact{clear:both}#converse-roster dd.current-xmpp-contact span{font-size:16px;float:left;color:#4f4f4f}#converse-roster dd.requesting-xmpp-contact button{margin-left:.5em}#converse-roster dd a,#converse-roster dd span{text-shadow:0 1px 0 rgba(250,250,250,1);display:inline-block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#converse-roster dd span{padding:2px 5px 0 0}#converse-roster{height:200px;overflow-y:auto;overflow-x:hidden;width:100%;margin:0;position:relative;top:0;border:0;margin-top:.5em}#available-chatrooms dd{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;width:165px}#available-chatrooms dt,#converse-roster dt{font-weight:400;font-size:13px;color:#666;border:0;padding:.3em 0 0 .5em;text-shadow:0 1px 0 rgba(250,250,250,1)}#converse-roster dt{display:none}dd.available-chatroom,#converse-roster dd{font-weight:700;border:0;display:block;padding:0 0 0 .5em;color:#666;text-shadow:0 1px 0 rgba(250,250,250,1)}.room-info{font-size:11px;font-style:normal;font-weight:400}li.room-info{display:block;margin-left:5px}div.room-info{clear:left}p.room-info{margin:0;padding:0;display:block;white-space:normal}a.room-info{width:22px;height:22px;float:right;display:none;clear:right}a.open-room{float:left;white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden}dd.available-chatroom:hover a.room-info{display:inline-block;margin-top:3px;font-size:15px}#converse-roster dd a.remove-xmpp-contact{line-height:21px;float:right;width:22px;margin:0;display:none;color:#4f4f4f}#converse-roster dd:hover a.remove-xmpp-contact{display:inline-block}#converse-roster a.open-chat{line-height:21px;width:85%}#converse-roster dd:hover a.open-chat{width:70%}.chatbox,.chatroom{box-shadow:1px 1px 5px 1px rgba(0,0,0,.4);display:none;float:right;margin-right:15px;z-index:20;border-radius:4px}.chatbox{width:200px}.chatroom{width:300px}.oc-chat-content{height:274px;padding:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.oc-chat-content dd{margin-left:0;margin-bottom:0;padding:1em}.oc-chat-content dd.odd{background-color:#DCEAC5}div#controlbox-panes{background:-moz-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-ms-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-o-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(255,255,255,1)),color-stop(100%,rgba(240,240,240,1)));background:-webkit-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px;width:200px}form#converse-login{background:#fff;padding:2em 0 .3em .5em}form#converse-login input{display:block;width:90%}form#converse-login .login-submit{margin-top:1em;width:auto}form.set-xmpp-status{background:0;padding:.5em 0 .5em .5em}form.add-chatroom{background:0;padding:3px}form.add-chatroom input[type=text]{width:95%;margin:3px}form.add-chatroom input[type=button],form.add-chatroom input[type=submit]{width:48%}select#select-xmpp-status{float:right;margin-right:.5em}.chat-head #controlbox-tabs{text-align:center;display:inline;overflow:hidden;font-size:12px;list-style-type:none}.chat-head #controlbox-tabs li{float:left;list-style:none;padding-left:0;text-shadow:#fff 0 1px 0;width:40%}ul#controlbox-tabs li a{display:block;font-size:12px;height:34px;line-height:34px;margin:0;text-align:center;text-decoration:none;border-top-right-radius:5px;border-top-left-radius:5px;color:#666;text-shadow:0 1px 0 rgba(250,250,250,1)}.chat-head #controlbox-tabs li a:hover{color:#000}.chat-head #controlbox-tabs li a{background-color:#fff;box-shadow:inset 0 4px 12px rgba(0,0,0,.3);border-bottom:1px solid #CCC}ul#controlbox-tabs a.current,ul#controlbox-tabs a.current:hover{box-shadow:none;border-bottom:0;height:35px;cursor:default;color:#666}div#users,div#chatrooms,div#login-dialog,div#settings{border:0;font-size:14px;background-color:#fff;border-bottom-right-radius:4px;border-bottom-left-radius:4px;width:100%}div#chatrooms{overflow-y:auto}form.sendXMPPMessage{background:#fff;border:0;border-top:1px solid #BBB;padding:0;margin:0;position:relative;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;border-top-left-radius:0;border-top-right-radius:0;height:65px;width:200px}.chatroom form.sendXMPPMessage{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;height:65px}.chat-textarea{box-sizing:border-box;-moz-box-sizing:border-box;border:0;width:100%;padding:3px;border-radius:4px;resize:none;height:65px}ul.chat-toolbar{font-size:14px;margin:0;padding:0 5px 0 0;float:right;display:inline-block;height:20px}ul.chat-toolbar li{display:inline-block;list-style:none;padding:0 3px}ul.chat-toolbar li:hover{cursor:pointer;color:#272727}form#set-custom-xmpp-status{float:left;padding:0}.chat-textarea-chatbox-selected{border:1px solid #578308;margin:0}.chat-textarea-chatroom-selected{border:2px solid #2D617A;margin:0}#set-custom-xmpp-status button{padding:1px 2px 1px 1px}#controlbox div.xmpp-status{display:inline}.chatbox dl.dropdown{margin-right:.5em;margin-bottom:0;background-color:#f0f0f0}.chatbox .dropdown dd,.dropdown dt,.dropdown ul{margin:0;padding:0}.chatbox .dropdown dd{position:relative}input.custom-xmpp-status{width:138px}form.add-xmpp-contact{background:0;padding:5px}form.add-xmpp-contact input{width:120px}.chatbox .dropdown dt a span{cursor:pointer;display:block;padding:2px 7px 0 5px;color:#4f4f4f}.chatbox .dropdown dd ul{padding:5px 0;list-style:none;position:absolute;left:0;top:0;border:1px solid #ddd;border-top:0;width:99%;z-index:21;background-color:#f0f0f0}.chatbox .dropdown li{list-style:none;padding-left:0}.set-xmpp-status .dropdown dd ul{z-index:22}.chatbox .dropdown a{height:22px;display:inline-block;padding-top:2px}.chatbox .dropdown dd ul a:hover{background-color:#bed6e5}.xmpp-status-menu li a{width:100%}.xmpp-status-menu li a span{padding:0 5px;color:#4f4f4f}
\ No newline at end of file \ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
# Sphinx build info version 1 # Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: cc4e774ae6c30c8f75f9540598d47e5a config: 4e01f0b4332cc0ad20271406d2d00beb
tags: fbb0d17656682115ca4d033fb2f83ba1 tags: fbb0d17656682115ca4d033fb2f83ba1
...@@ -553,6 +553,14 @@ To minify the Javascript and CSS, run the following command: ...@@ -553,6 +553,14 @@ To minify the Javascript and CSS, run the following command:
grunt minify grunt minify
.. Note ::
Since release 0.6.0, I'm using `almond <https://github.com/jrburke/almond>`_
instead of `require.js <http://requirejs.org>`_. The
`grunt-contrib-requirejs <https://github.com/gruntjs/grunt-contrib-requirejs>`_
plugin however doesn't support *almond*. I therefore now build it manually
(the old way again), like this: ``r.js -o build.js``. CSS can be minimized
separately via ``grunt cssmin``.
Javascript will be bundled and minified via `require.js`_'s optimization tool. Javascript will be bundled and minified via `require.js`_'s optimization tool.
You can `read more about require.js's optimizer here`_. You can `read more about require.js's optimizer here`_.
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &mdash; Converse.js 0.5.3 documentation</title> <title>Index &mdash; Converse.js 0.6.0 documentation</title>
<link rel="stylesheet" href="_static/stylesheet.css" type="text/css" /> <link rel="stylesheet" href="_static/stylesheet.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<script type="text/javascript"> <script type="text/javascript">
var DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT: '', URL_ROOT: '',
VERSION: '0.5.3', VERSION: '0.6.0',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html', FILE_SUFFIX: '.html',
HAS_SOURCE: true HAS_SOURCE: true
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
<script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="Converse.js 0.5.3 documentation" href="index.html" /> <link rel="top" title="Converse.js 0.6.0 documentation" href="index.html" />
</head> </head>
<body> <body>
<div id="header_wrap" class="outer"> <div id="header_wrap" class="outer">
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
<a href="#" title="General Index" <a href="#" title="General Index"
accesskey="I">index</a></li> accesskey="I">index</a></li>
<li><a href="index.html">Converse.js 0.5.3 documentation</a> &raquo;</li> <li><a href="index.html">Converse.js 0.6.0 documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<section id="main_content" class="inner"> <section id="main_content" class="inner">
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
<a href="#" title="General Index" <a href="#" title="General Index"
>index</a></li> >index</a></li>
<li><a href="index.html">Converse.js 0.5.3 documentation</a> &raquo;</li> <li><a href="index.html">Converse.js 0.6.0 documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
</div> </div>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Quickstart (to get a demo up and running) &mdash; Converse.js 0.5.3 documentation</title> <title>Quickstart (to get a demo up and running) &mdash; Converse.js 0.6.0 documentation</title>
<link rel="stylesheet" href="_static/stylesheet.css" type="text/css" /> <link rel="stylesheet" href="_static/stylesheet.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<script type="text/javascript"> <script type="text/javascript">
var DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT: '', URL_ROOT: '',
VERSION: '0.5.3', VERSION: '0.6.0',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html', FILE_SUFFIX: '.html',
HAS_SOURCE: true HAS_SOURCE: true
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="Converse.js 0.5.3 documentation" href="#" /> <link rel="top" title="Converse.js 0.6.0 documentation" href="#" />
</head> </head>
<body> <body>
<div id="header_wrap" class="outer"> <div id="header_wrap" class="outer">
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index" <a href="genindex.html" title="General Index"
accesskey="I">index</a></li> accesskey="I">index</a></li>
<li><a href="#">Converse.js 0.5.3 documentation</a> &raquo;</li> <li><a href="#">Converse.js 0.6.0 documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<section id="main_content" class="inner"> <section id="main_content" class="inner">
...@@ -65,60 +65,60 @@ ...@@ -65,60 +65,60 @@
<div class="contents local topic" id="table-of-contents"> <div class="contents local topic" id="table-of-contents">
<p class="topic-title first">Table of Contents</p> <p class="topic-title first">Table of Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#quickstart-to-get-a-demo-up-and-running" id="id2">Quickstart (to get a demo up and running)</a></li> <li><a class="reference internal" href="#quickstart-to-get-a-demo-up-and-running" id="id3">Quickstart (to get a demo up and running)</a></li>
<li><a class="reference internal" href="#introduction" id="id3">Introduction</a></li> <li><a class="reference internal" href="#introduction" id="id4">Introduction</a></li>
<li><a class="reference internal" href="#what-you-will-need" id="id4">What you will need</a><ul> <li><a class="reference internal" href="#what-you-will-need" id="id5">What you will need</a><ul>
<li><a class="reference internal" href="#an-xmpp-jabber-server" id="id5">An XMPP/Jabber server</a></li> <li><a class="reference internal" href="#an-xmpp-jabber-server" id="id6">An XMPP/Jabber server</a></li>
<li><a class="reference internal" href="#connection-manager" id="id6">Connection Manager</a><ul> <li><a class="reference internal" href="#connection-manager" id="id7">Connection Manager</a><ul>
<li><a class="reference internal" href="#overcoming-cross-domain-request-restrictions" id="id7">Overcoming cross-domain request restrictions</a></li> <li><a class="reference internal" href="#overcoming-cross-domain-request-restrictions" id="id8">Overcoming cross-domain request restrictions</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#server-side-authentication" id="id8">Server-side authentication</a><ul> <li><a class="reference internal" href="#server-side-authentication" id="id9">Server-side authentication</a><ul>
<li><a class="reference internal" href="#pre-binding-and-single-session-support" id="id9">Pre-binding and Single Session Support</a></li> <li><a class="reference internal" href="#pre-binding-and-single-session-support" id="id10">Pre-binding and Single Session Support</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#facebook-integration" id="id10">Facebook integration</a></li> <li><a class="reference internal" href="#facebook-integration" id="id11">Facebook integration</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#development" id="id11">Development</a><ul> <li><a class="reference internal" href="#development" id="id12">Development</a><ul>
<li><a class="reference internal" href="#install-node-js-and-development-dependencies" id="id12">Install Node.js and development dependencies</a></li> <li><a class="reference internal" href="#install-node-js-and-development-dependencies" id="id13">Install Node.js and development dependencies</a></li>
<li><a class="reference internal" href="#install-3rd-party-dependencies" id="id13">Install 3rd party dependencies</a></li> <li><a class="reference internal" href="#install-3rd-party-dependencies" id="id14">Install 3rd party dependencies</a></li>
<li><a class="reference internal" href="#with-amd-and-require-js-recommended" id="id14">With AMD and require.js (recommended)</a></li> <li><a class="reference internal" href="#with-amd-and-require-js-recommended" id="id15">With AMD and require.js (recommended)</a></li>
<li><a class="reference internal" href="#without-amd-and-require-js" id="id15">Without AMD and require.js</a></li> <li><a class="reference internal" href="#without-amd-and-require-js" id="id16">Without AMD and require.js</a></li>
<li><a class="reference internal" href="#before-submitting-a-pull-request" id="id16">Before submitting a pull request</a><ul> <li><a class="reference internal" href="#before-submitting-a-pull-request" id="id17">Before submitting a pull request</a><ul>
<li><a class="reference internal" href="#add-tests-for-your-bugfix-or-feature" id="id17">Add tests for your bugfix or feature</a></li> <li><a class="reference internal" href="#add-tests-for-your-bugfix-or-feature" id="id18">Add tests for your bugfix or feature</a></li>
<li><a class="reference internal" href="#check-that-the-tests-pass" id="id18">Check that the tests pass</a></li> <li><a class="reference internal" href="#check-that-the-tests-pass" id="id19">Check that the tests pass</a></li>
<li><a class="reference internal" href="#check-your-code-for-errors-or-bad-habits-by-running-jshint" id="id19">Check your code for errors or bad habits by running JSHint</a></li> <li><a class="reference internal" href="#check-your-code-for-errors-or-bad-habits-by-running-jshint" id="id20">Check your code for errors or bad habits by running JSHint</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#configuration" id="id20">Configuration</a><ul> <li><a class="reference internal" href="#configuration" id="id21">Configuration</a><ul>
<li><a class="reference internal" href="#configuration-variables" id="id21">Configuration variables</a><ul> <li><a class="reference internal" href="#configuration-variables" id="id22">Configuration variables</a><ul>
<li><a class="reference internal" href="#animate" id="id22">animate</a></li> <li><a class="reference internal" href="#animate" id="id23">animate</a></li>
<li><a class="reference internal" href="#auto-list-rooms" id="id23">auto_list_rooms</a></li> <li><a class="reference internal" href="#auto-list-rooms" id="id24">auto_list_rooms</a></li>
<li><a class="reference internal" href="#auto-subscribe" id="id24">auto_subscribe</a></li> <li><a class="reference internal" href="#auto-subscribe" id="id25">auto_subscribe</a></li>
<li><a class="reference internal" href="#bosh-service-url" id="id25">bosh_service_url</a></li> <li><a class="reference internal" href="#bosh-service-url" id="id26">bosh_service_url</a></li>
<li><a class="reference internal" href="#debug" id="id26">debug</a></li> <li><a class="reference internal" href="#debug" id="id27">debug</a></li>
<li><a class="reference internal" href="#fullname" id="id27">fullname</a></li> <li><a class="reference internal" href="#fullname" id="id28">fullname</a></li>
<li><a class="reference internal" href="#hide-muc-server" id="id28">hide_muc_server</a></li> <li><a class="reference internal" href="#hide-muc-server" id="id29">hide_muc_server</a></li>
<li><a class="reference internal" href="#i18n" id="id29">i18n</a></li> <li><a class="reference internal" href="#i18n" id="id30">i18n</a></li>
<li><a class="reference internal" href="#prebind" id="id30">prebind</a></li> <li><a class="reference internal" href="#prebind" id="id31">prebind</a></li>
<li><a class="reference internal" href="#show-controlbox-by-default" id="id31">show_controlbox_by_default</a></li> <li><a class="reference internal" href="#show-controlbox-by-default" id="id32">show_controlbox_by_default</a></li>
<li><a class="reference internal" href="#xhr-user-search" id="id32">xhr_user_search</a></li> <li><a class="reference internal" href="#xhr-user-search" id="id33">xhr_user_search</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#minification" id="id33">Minification</a><ul> <li><a class="reference internal" href="#minification" id="id34">Minification</a><ul>
<li><a class="reference internal" href="#minifying-javascript-and-css" id="id34">Minifying Javascript and CSS</a></li> <li><a class="reference internal" href="#minifying-javascript-and-css" id="id35">Minifying Javascript and CSS</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#translations" id="id35">Translations</a></li> <li><a class="reference internal" href="#translations" id="id36">Translations</a></li>
</ul> </ul>
</div> </div>
<div class="section" id="quickstart-to-get-a-demo-up-and-running"> <div class="section" id="quickstart-to-get-a-demo-up-and-running">
<h1><a class="toc-backref" href="#id2">Quickstart (to get a demo up and running)</a><a class="headerlink" href="#quickstart-to-get-a-demo-up-and-running" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id3">Quickstart (to get a demo up and running)</a><a class="headerlink" href="#quickstart-to-get-a-demo-up-and-running" title="Permalink to this headline"></a></h1>
<p>When you download a specific release of <em>Converse.js</em> there will be two minified files inside the zip file.</p> <p>When you download a specific release of <em>Converse.js</em> there will be two minified files inside the zip file.</p>
<ul class="simple"> <ul class="simple">
<li>converse.min.js</li> <li>converse.min.js</li>
...@@ -172,7 +172,7 @@ the minified Javascript file. Read <a class="reference internal" href="#configur ...@@ -172,7 +172,7 @@ the minified Javascript file. Read <a class="reference internal" href="#configur
that.</p> that.</p>
</div> </div>
<div class="section" id="introduction"> <div class="section" id="introduction">
<h1><a class="toc-backref" href="#id3">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id4">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h1>
<p>Even though you can connect to public XMPP servers on the <a class="reference external" href="http://conversejs.org">conversejs.org</a> <p>Even though you can connect to public XMPP servers on the <a class="reference external" href="http://conversejs.org">conversejs.org</a>
website, <em>Converse.js</em> is not really meant to be a &#8220;Software-as-a-service&#8221; (SaaS) website, <em>Converse.js</em> is not really meant to be a &#8220;Software-as-a-service&#8221; (SaaS)
webchat.</p> webchat.</p>
...@@ -191,9 +191,9 @@ code.</p> ...@@ -191,9 +191,9 @@ code.</p>
requirements.</p> requirements.</p>
</div> </div>
<div class="section" id="what-you-will-need"> <div class="section" id="what-you-will-need">
<h1><a class="toc-backref" href="#id4">What you will need</a><a class="headerlink" href="#what-you-will-need" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id5">What you will need</a><a class="headerlink" href="#what-you-will-need" title="Permalink to this headline"></a></h1>
<div class="section" id="an-xmpp-jabber-server"> <div class="section" id="an-xmpp-jabber-server">
<h2><a class="toc-backref" href="#id5">An XMPP/Jabber server</a><a class="headerlink" href="#an-xmpp-jabber-server" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id6">An XMPP/Jabber server</a><a class="headerlink" href="#an-xmpp-jabber-server" title="Permalink to this headline"></a></h2>
<p><em>Converse.js</em> implements <a class="reference external" href="https://en.wikipedia.org/wiki/Xmpp">XMPP</a> as its messaging protocol, and therefore needs <p><em>Converse.js</em> implements <a class="reference external" href="https://en.wikipedia.org/wiki/Xmpp">XMPP</a> as its messaging protocol, and therefore needs
to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).</p> to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).</p>
<p>You can connect to public XMPP servers like <tt class="docutils literal"><span class="pre">jabber.org</span></tt> but if you want to <p>You can connect to public XMPP servers like <tt class="docutils literal"><span class="pre">jabber.org</span></tt> but if you want to
...@@ -202,7 +202,7 @@ have <a class="reference internal" href="#session-support">Session Support</a> y ...@@ -202,7 +202,7 @@ have <a class="reference internal" href="#session-support">Session Support</a> y
servers that you can set up yourself on <a class="reference external" href="http://xmpp.org/xmpp-software/servers/">xmpp.org</a>.</p> servers that you can set up yourself on <a class="reference external" href="http://xmpp.org/xmpp-software/servers/">xmpp.org</a>.</p>
</div> </div>
<div class="section" id="connection-manager"> <div class="section" id="connection-manager">
<h2><a class="toc-backref" href="#id6">Connection Manager</a><a class="headerlink" href="#connection-manager" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id7">Connection Manager</a><a class="headerlink" href="#connection-manager" title="Permalink to this headline"></a></h2>
<p>Your website and <em>Converse.js</em> use <a class="reference external" href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> as protocol to communicate with <p>Your website and <em>Converse.js</em> use <a class="reference external" href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> as protocol to communicate with
the webserver. HTTP connections are stateless and usually shortlived.</p> the webserver. HTTP connections are stateless and usually shortlived.</p>
<p><a class="reference external" href="https://en.wikipedia.org/wiki/Xmpp">XMPP</a> on the other hand, is the protocol that enables instant messaging, and <p><a class="reference external" href="https://en.wikipedia.org/wiki/Xmpp">XMPP</a> on the other hand, is the protocol that enables instant messaging, and
...@@ -217,7 +217,7 @@ includes a connection manager (but you have to enable it).</p> ...@@ -217,7 +217,7 @@ includes a connection manager (but you have to enable it).</p>
This connection manager is for testing purposes only, please don&#8217;t use it in This connection manager is for testing purposes only, please don&#8217;t use it in
production.</p> production.</p>
<div class="section" id="overcoming-cross-domain-request-restrictions"> <div class="section" id="overcoming-cross-domain-request-restrictions">
<h3><a class="toc-backref" href="#id7">Overcoming cross-domain request restrictions</a><a class="headerlink" href="#overcoming-cross-domain-request-restrictions" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id8">Overcoming cross-domain request restrictions</a><a class="headerlink" href="#overcoming-cross-domain-request-restrictions" title="Permalink to this headline"></a></h3>
<p>The domain of the <em>Converse.js</em> demo is <em>conversejs.org</em>, but the domain of the connection manager is <em>opkode.im</em>. <p>The domain of the <em>Converse.js</em> demo is <em>conversejs.org</em>, but the domain of the connection manager is <em>opkode.im</em>.
HTTP requests are made by <em>Converse.js</em> to the connection manager via XmlHttpRequests (XHR). HTTP requests are made by <em>Converse.js</em> to the connection manager via XmlHttpRequests (XHR).
Until recently, it was not possible to make such requests to a different domain Until recently, it was not possible to make such requests to a different domain
...@@ -235,9 +235,9 @@ website. This will remove the need for any cross-domain XHR support.</p> ...@@ -235,9 +235,9 @@ website. This will remove the need for any cross-domain XHR support.</p>
</div> </div>
</div> </div>
<div class="section" id="server-side-authentication"> <div class="section" id="server-side-authentication">
<h2><a class="toc-backref" href="#id8">Server-side authentication</a><a class="headerlink" href="#server-side-authentication" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id9">Server-side authentication</a><a class="headerlink" href="#server-side-authentication" title="Permalink to this headline"></a></h2>
<div class="section" id="pre-binding-and-single-session-support"> <div class="section" id="pre-binding-and-single-session-support">
<span id="session-support"></span><h3><a class="toc-backref" href="#id9">Pre-binding and Single Session Support</a><a class="headerlink" href="#pre-binding-and-single-session-support" title="Permalink to this headline"></a></h3> <span id="session-support"></span><h3><a class="toc-backref" href="#id10">Pre-binding and Single Session Support</a><a class="headerlink" href="#pre-binding-and-single-session-support" title="Permalink to this headline"></a></h3>
<p>It&#8217;s possible to enable single-site login, whereby users already <p>It&#8217;s possible to enable single-site login, whereby users already
authenticated in your website will also automatically be logged in on the chat server, authenticated in your website will also automatically be logged in on the chat server,
but this will require custom code on your server.</p> but this will require custom code on your server.</p>
...@@ -273,7 +273,7 @@ BOSH connection manager.</p> ...@@ -273,7 +273,7 @@ BOSH connection manager.</p>
</div> </div>
</div> </div>
<div class="section" id="facebook-integration"> <div class="section" id="facebook-integration">
<h2><a class="toc-backref" href="#id10">Facebook integration</a><a class="headerlink" href="#facebook-integration" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id11">Facebook integration</a><a class="headerlink" href="#facebook-integration" title="Permalink to this headline"></a></h2>
<div class="admonition note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">It should be possible to integrate Converse.js with Facebook chat, and <p class="last">It should be possible to integrate Converse.js with Facebook chat, and
...@@ -316,13 +316,13 @@ Until then, people will have to do this themselves.</p> ...@@ -316,13 +316,13 @@ Until then, people will have to do this themselves.</p>
</div> </div>
</div> </div>
<div class="section" id="development"> <div class="section" id="development">
<h1><a class="toc-backref" href="#id11">Development</a><a class="headerlink" href="#development" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id12">Development</a><a class="headerlink" href="#development" title="Permalink to this headline"></a></h1>
<p>If you want to work with the non-minified Javascript and CSS files you&#8217;ll soon <p>If you want to work with the non-minified Javascript and CSS files you&#8217;ll soon
notice that there are references to a missing <em>components</em> folder. Please notice that there are references to a missing <em>components</em> folder. Please
follow the instructions below to create this folder and fetch Converse&#8217;s follow the instructions below to create this folder and fetch Converse&#8217;s
3rd-party dependencies.</p> 3rd-party dependencies.</p>
<div class="section" id="install-node-js-and-development-dependencies"> <div class="section" id="install-node-js-and-development-dependencies">
<h2><a class="toc-backref" href="#id12">Install Node.js and development dependencies</a><a class="headerlink" href="#install-node-js-and-development-dependencies" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id13">Install Node.js and development dependencies</a><a class="headerlink" href="#install-node-js-and-development-dependencies" title="Permalink to this headline"></a></h2>
<p>We use development tools (<a class="reference external" href="http://gruntjs.com">Grunt</a> and <a class="reference external" href="http://bower.io">Bower</a>) <p>We use development tools (<a class="reference external" href="http://gruntjs.com">Grunt</a> and <a class="reference external" href="http://bower.io">Bower</a>)
which depend on Node.js and npm (the Node package manager).</p> which depend on Node.js and npm (the Node package manager).</p>
<p>If you don&#8217;t have Node.js installed, you can download and install the latest <p>If you don&#8217;t have Node.js installed, you can download and install the latest
...@@ -336,7 +336,7 @@ curious to know what these are, take a look at whats under the <em>devDependenci ...@@ -336,7 +336,7 @@ curious to know what these are, take a look at whats under the <em>devDependenci
<cite>package.json &lt;https://github.com/jcbrand/converse.js/blob/master/package.json&gt;</cite>.</p> <cite>package.json &lt;https://github.com/jcbrand/converse.js/blob/master/package.json&gt;</cite>.</p>
</div> </div>
<div class="section" id="install-3rd-party-dependencies"> <div class="section" id="install-3rd-party-dependencies">
<h2><a class="toc-backref" href="#id13">Install 3rd party dependencies</a><a class="headerlink" href="#install-3rd-party-dependencies" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id14">Install 3rd party dependencies</a><a class="headerlink" href="#install-3rd-party-dependencies" title="Permalink to this headline"></a></h2>
<p>After running <tt class="docutils literal"><span class="pre">npm</span> <span class="pre">install</span></tt>, you will now have Grunt and Bower installed.</p> <p>After running <tt class="docutils literal"><span class="pre">npm</span> <span class="pre">install</span></tt>, you will now have Grunt and Bower installed.</p>
<p>We use Bower to manage Converse&#8217;s front-end dependencies (e.g. Javascript that <p>We use Bower to manage Converse&#8217;s front-end dependencies (e.g. Javascript that
should get loaded in the browser).</p> should get loaded in the browser).</p>
...@@ -348,7 +348,7 @@ dependencies (like backbone.js, strophe.js etc.) and then put them in the ...@@ -348,7 +348,7 @@ dependencies (like backbone.js, strophe.js etc.) and then put them in the
<em>components</em> folder.</p> <em>components</em> folder.</p>
</div> </div>
<div class="section" id="with-amd-and-require-js-recommended"> <div class="section" id="with-amd-and-require-js-recommended">
<h2><a class="toc-backref" href="#id14">With AMD and require.js (recommended)</a><a class="headerlink" href="#with-amd-and-require-js-recommended" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id15">With AMD and require.js (recommended)</a><a class="headerlink" href="#with-amd-and-require-js-recommended" title="Permalink to this headline"></a></h2>
<p>Converse.js uses <a class="reference external" href="http://requirejs.org">require.js</a> to asynchronously load dependencies.</p> <p>Converse.js uses <a class="reference external" href="http://requirejs.org">require.js</a> to asynchronously load dependencies.</p>
<p>If you want to develop or customize converse.js, you&#8217;ll want to load the <p>If you want to develop or customize converse.js, you&#8217;ll want to load the
non-minified javascript files.</p> non-minified javascript files.</p>
...@@ -361,7 +361,7 @@ attribute on the <em>script</em> tag), which will in turn cause converse.js to b ...@@ -361,7 +361,7 @@ attribute on the <em>script</em> tag), which will in turn cause converse.js to b
parsed.</p> parsed.</p>
</div> </div>
<div class="section" id="without-amd-and-require-js"> <div class="section" id="without-amd-and-require-js">
<h2><a class="toc-backref" href="#id15">Without AMD and require.js</a><a class="headerlink" href="#without-amd-and-require-js" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id16">Without AMD and require.js</a><a class="headerlink" href="#without-amd-and-require-js" title="Permalink to this headline"></a></h2>
<p>Converse.js can also be used without require.js. If you for some reason prefer <p>Converse.js can also be used without require.js. If you for some reason prefer
to use it this way, please refer to to use it this way, please refer to
<a class="reference external" href="https://github.com/jcbrand/converse.js/blob/master/non_amd.html">non_amd.html</a> <a class="reference external" href="https://github.com/jcbrand/converse.js/blob/master/non_amd.html">non_amd.html</a>
...@@ -369,9 +369,9 @@ for an example of how and in what order all the Javascript files that converse.j ...@@ -369,9 +369,9 @@ for an example of how and in what order all the Javascript files that converse.j
depends on need to be loaded.</p> depends on need to be loaded.</p>
</div> </div>
<div class="section" id="before-submitting-a-pull-request"> <div class="section" id="before-submitting-a-pull-request">
<h2><a class="toc-backref" href="#id16">Before submitting a pull request</a><a class="headerlink" href="#before-submitting-a-pull-request" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id17">Before submitting a pull request</a><a class="headerlink" href="#before-submitting-a-pull-request" title="Permalink to this headline"></a></h2>
<div class="section" id="add-tests-for-your-bugfix-or-feature"> <div class="section" id="add-tests-for-your-bugfix-or-feature">
<h3><a class="toc-backref" href="#id17">Add tests for your bugfix or feature</a><a class="headerlink" href="#add-tests-for-your-bugfix-or-feature" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id18">Add tests for your bugfix or feature</a><a class="headerlink" href="#add-tests-for-your-bugfix-or-feature" title="Permalink to this headline"></a></h3>
<p>Add a test for any bug fixed or feature added. We use Jasmine <p>Add a test for any bug fixed or feature added. We use Jasmine
for testing.</p> for testing.</p>
<p>Take a look at <tt class="docutils literal"><span class="pre">tests.html</span></tt> and <tt class="docutils literal"><span class="pre">spec/MainSpec.js</span></tt> to see how <p>Take a look at <tt class="docutils literal"><span class="pre">tests.html</span></tt> and <tt class="docutils literal"><span class="pre">spec/MainSpec.js</span></tt> to see how
...@@ -380,7 +380,7 @@ the tests are implemented.</p> ...@@ -380,7 +380,7 @@ the tests are implemented.</p>
<a class="reference external" href="http://opkode.com/contact">contact me</a> and I&#8217;ll be happy to help.</p> <a class="reference external" href="http://opkode.com/contact">contact me</a> and I&#8217;ll be happy to help.</p>
</div> </div>
<div class="section" id="check-that-the-tests-pass"> <div class="section" id="check-that-the-tests-pass">
<h3><a class="toc-backref" href="#id18">Check that the tests pass</a><a class="headerlink" href="#check-that-the-tests-pass" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id19">Check that the tests pass</a><a class="headerlink" href="#check-that-the-tests-pass" title="Permalink to this headline"></a></h3>
<p>Check that the Jasmine tests complete sucessfully. Open <p>Check that the Jasmine tests complete sucessfully. Open
<a class="reference external" href="https://github.com/jcbrand/converse.js/blob/master/tests.html">tests.html</a> <a class="reference external" href="https://github.com/jcbrand/converse.js/blob/master/tests.html">tests.html</a>
in your browser, and the tests will run automatically.</p> in your browser, and the tests will run automatically.</p>
...@@ -389,7 +389,7 @@ in your browser, and the tests will run automatically.</p> ...@@ -389,7 +389,7 @@ in your browser, and the tests will run automatically.</p>
</div> </div>
</div> </div>
<div class="section" id="check-your-code-for-errors-or-bad-habits-by-running-jshint"> <div class="section" id="check-your-code-for-errors-or-bad-habits-by-running-jshint">
<h3><a class="toc-backref" href="#id19">Check your code for errors or bad habits by running JSHint</a><a class="headerlink" href="#check-your-code-for-errors-or-bad-habits-by-running-jshint" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id20">Check your code for errors or bad habits by running JSHint</a><a class="headerlink" href="#check-your-code-for-errors-or-bad-habits-by-running-jshint" title="Permalink to this headline"></a></h3>
<p><a class="reference external" href="http://jshint.com">JSHint</a> will do a static analysis of your code and hightlight potential errors <p><a class="reference external" href="http://jshint.com">JSHint</a> will do a static analysis of your code and hightlight potential errors
and/or bad habits.</p> and/or bad habits.</p>
<div class="highlight-python"><pre>grunt jshint</pre> <div class="highlight-python"><pre>grunt jshint</pre>
...@@ -401,7 +401,7 @@ and/or bad habits.</p> ...@@ -401,7 +401,7 @@ and/or bad habits.</p>
</div> </div>
</div> </div>
<div class="section" id="configuration"> <div class="section" id="configuration">
<h1><a class="toc-backref" href="#id20">Configuration</a><a class="headerlink" href="#configuration" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id21">Configuration</a><a class="headerlink" href="#configuration" title="Permalink to this headline"></a></h1>
<p>The included minified JS and CSS files can be used for demoing or testing, but <p>The included minified JS and CSS files can be used for demoing or testing, but
you&#8217;ll want to configure <em>Converse.js</em> to suit your needs before you deploy it you&#8217;ll want to configure <em>Converse.js</em> to suit your needs before you deploy it
on your website.</p> on your website.</p>
...@@ -415,14 +415,14 @@ all the available configuration settings.</p> ...@@ -415,14 +415,14 @@ all the available configuration settings.</p>
JS file so that it will include the new settings. Please refer to the JS file so that it will include the new settings. Please refer to the
<a class="reference internal" href="#minification">Minification</a> section for more info on how to do this.</p> <a class="reference internal" href="#minification">Minification</a> section for more info on how to do this.</p>
<div class="section" id="configuration-variables"> <div class="section" id="configuration-variables">
<h2><a class="toc-backref" href="#id21">Configuration variables</a><a class="headerlink" href="#configuration-variables" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id22">Configuration variables</a><a class="headerlink" href="#configuration-variables" title="Permalink to this headline"></a></h2>
<div class="section" id="animate"> <div class="section" id="animate">
<h3><a class="toc-backref" href="#id22">animate</a><a class="headerlink" href="#animate" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id23">animate</a><a class="headerlink" href="#animate" title="Permalink to this headline"></a></h3>
<p>Default = True</p> <p>Default = True</p>
<p>Show animations, for example when opening and closing chat boxes.</p> <p>Show animations, for example when opening and closing chat boxes.</p>
</div> </div>
<div class="section" id="auto-list-rooms"> <div class="section" id="auto-list-rooms">
<h3><a class="toc-backref" href="#id23">auto_list_rooms</a><a class="headerlink" href="#auto-list-rooms" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id24">auto_list_rooms</a><a class="headerlink" href="#auto-list-rooms" title="Permalink to this headline"></a></h3>
<p>Default = False</p> <p>Default = False</p>
<p>If true, and the XMPP server on which the current user is logged in supports <p>If true, and the XMPP server on which the current user is logged in supports
multi-user chat, then a list of rooms on that server will be fetched.</p> multi-user chat, then a list of rooms on that server will be fetched.</p>
...@@ -432,39 +432,39 @@ features, number of occupants etc.), so on servers with many rooms this ...@@ -432,39 +432,39 @@ features, number of occupants etc.), so on servers with many rooms this
option will create lots of extra connection traffic.</p> option will create lots of extra connection traffic.</p>
</div> </div>
<div class="section" id="auto-subscribe"> <div class="section" id="auto-subscribe">
<h3><a class="toc-backref" href="#id24">auto_subscribe</a><a class="headerlink" href="#auto-subscribe" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id25">auto_subscribe</a><a class="headerlink" href="#auto-subscribe" title="Permalink to this headline"></a></h3>
<p>Default = False</p> <p>Default = False</p>
<p>If true, the user will automatically subscribe back to any contact requests.</p> <p>If true, the user will automatically subscribe back to any contact requests.</p>
</div> </div>
<div class="section" id="bosh-service-url"> <div class="section" id="bosh-service-url">
<h3><a class="toc-backref" href="#id25">bosh_service_url</a><a class="headerlink" href="#bosh-service-url" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id26">bosh_service_url</a><a class="headerlink" href="#bosh-service-url" title="Permalink to this headline"></a></h3>
<p>Connections to an XMPP server depend on a BOSH connection manager which acts as <p>Connections to an XMPP server depend on a BOSH connection manager which acts as
a middle man between HTTP and XMPP.</p> a middle man between HTTP and XMPP.</p>
<p>See <a class="reference external" href="http://metajack.im/2008/09/08/which-bosh-server-do-you-need">here</a> for more information.</p> <p>See <a class="reference external" href="http://metajack.im/2008/09/08/which-bosh-server-do-you-need">here</a> for more information.</p>
</div> </div>
<div class="section" id="debug"> <div class="section" id="debug">
<h3><a class="toc-backref" href="#id26">debug</a><a class="headerlink" href="#debug" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id27">debug</a><a class="headerlink" href="#debug" title="Permalink to this headline"></a></h3>
<p>If set to true, debugging output will be logged to the browser console.</p> <p>If set to true, debugging output will be logged to the browser console.</p>
</div> </div>
<div class="section" id="fullname"> <div class="section" id="fullname">
<h3><a class="toc-backref" href="#id27">fullname</a><a class="headerlink" href="#fullname" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id28">fullname</a><a class="headerlink" href="#fullname" title="Permalink to this headline"></a></h3>
<p>If you are using prebinding, can specify the fullname of the currently <p>If you are using prebinding, can specify the fullname of the currently
logged in user, otherwise the user&#8217;s vCard will be fetched.</p> logged in user, otherwise the user&#8217;s vCard will be fetched.</p>
</div> </div>
<div class="section" id="hide-muc-server"> <div class="section" id="hide-muc-server">
<h3><a class="toc-backref" href="#id28">hide_muc_server</a><a class="headerlink" href="#hide-muc-server" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id29">hide_muc_server</a><a class="headerlink" href="#hide-muc-server" title="Permalink to this headline"></a></h3>
<p>Default = false</p> <p>Default = false</p>
<p>Hide the <tt class="docutils literal"><span class="pre">server</span></tt> input field of the form inside the <tt class="docutils literal"><span class="pre">Room</span></tt> panel of the <p>Hide the <tt class="docutils literal"><span class="pre">server</span></tt> input field of the form inside the <tt class="docutils literal"><span class="pre">Room</span></tt> panel of the
controlbox. Useful if you want to restrict users to a specific XMPP server of controlbox. Useful if you want to restrict users to a specific XMPP server of
your choosing.</p> your choosing.</p>
</div> </div>
<div class="section" id="i18n"> <div class="section" id="i18n">
<h3><a class="toc-backref" href="#id29">i18n</a><a class="headerlink" href="#i18n" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id30">i18n</a><a class="headerlink" href="#i18n" title="Permalink to this headline"></a></h3>
<p>Specify the locale/language. The language must be in the <tt class="docutils literal"><span class="pre">locales</span></tt> object. Refer to <p>Specify the locale/language. The language must be in the <tt class="docutils literal"><span class="pre">locales</span></tt> object. Refer to
<tt class="docutils literal"><span class="pre">./locale/locales.js</span></tt> to see which locales are supported.</p> <tt class="docutils literal"><span class="pre">./locale/locales.js</span></tt> to see which locales are supported.</p>
</div> </div>
<div class="section" id="prebind"> <div class="section" id="prebind">
<h3><a class="toc-backref" href="#id30">prebind</a><a class="headerlink" href="#prebind" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id31">prebind</a><a class="headerlink" href="#prebind" title="Permalink to this headline"></a></h3>
<p>Default = false</p> <p>Default = false</p>
<p>Use this option when you want to attach to an existing XMPP connection that was <p>Use this option when you want to attach to an existing XMPP connection that was
already authenticated (usually on the backend before page load).</p> already authenticated (usually on the backend before page load).</p>
...@@ -477,7 +477,7 @@ values as <tt class="docutils literal"><span class="pre">jid</span></tt>, <tt cl ...@@ -477,7 +477,7 @@ values as <tt class="docutils literal"><span class="pre">jid</span></tt>, <tt cl
<p>Additionally, you have to specify <tt class="docutils literal"><span class="pre">bosh_service_url</span></tt>.</p> <p>Additionally, you have to specify <tt class="docutils literal"><span class="pre">bosh_service_url</span></tt>.</p>
</div> </div>
<div class="section" id="show-controlbox-by-default"> <div class="section" id="show-controlbox-by-default">
<h3><a class="toc-backref" href="#id31">show_controlbox_by_default</a><a class="headerlink" href="#show-controlbox-by-default" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id32">show_controlbox_by_default</a><a class="headerlink" href="#show-controlbox-by-default" title="Permalink to this headline"></a></h3>
<p>Default = false</p> <p>Default = false</p>
<p>The &#8220;controlbox&#8221; refers to the special chatbox containing your contacts roster, <p>The &#8220;controlbox&#8221; refers to the special chatbox containing your contacts roster,
status widget, chatrooms and other controls.</p> status widget, chatrooms and other controls.</p>
...@@ -487,7 +487,7 @@ the page with class <em>toggle-online-users</em>.</p> ...@@ -487,7 +487,7 @@ the page with class <em>toggle-online-users</em>.</p>
page load.</p> page load.</p>
</div> </div>
<div class="section" id="xhr-user-search"> <div class="section" id="xhr-user-search">
<h3><a class="toc-backref" href="#id32">xhr_user_search</a><a class="headerlink" href="#xhr-user-search" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id33">xhr_user_search</a><a class="headerlink" href="#xhr-user-search" title="Permalink to this headline"></a></h3>
<p>Default = False</p> <p>Default = False</p>
<p>There are two ways to add users.</p> <p>There are two ways to add users.</p>
<ul class="simple"> <ul class="simple">
...@@ -500,9 +500,9 @@ be used.</p> ...@@ -500,9 +500,9 @@ be used.</p>
</div> </div>
</div> </div>
<div class="section" id="minification"> <div class="section" id="minification">
<h1><a class="toc-backref" href="#id33">Minification</a><a class="headerlink" href="#minification" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id34">Minification</a><a class="headerlink" href="#minification" title="Permalink to this headline"></a></h1>
<div class="section" id="minifying-javascript-and-css"> <div class="section" id="minifying-javascript-and-css">
<h2><a class="toc-backref" href="#id34">Minifying Javascript and CSS</a><a class="headerlink" href="#minifying-javascript-and-css" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id35">Minifying Javascript and CSS</a><a class="headerlink" href="#minifying-javascript-and-css" title="Permalink to this headline"></a></h2>
<p>Please make sure to read the section <a class="reference internal" href="#development">Development</a> and that you have installed <p>Please make sure to read the section <a class="reference internal" href="#development">Development</a> and that you have installed
all development dependencies (long story short, you can run <tt class="docutils literal"><span class="pre">npm</span> <span class="pre">install</span></tt> all development dependencies (long story short, you can run <tt class="docutils literal"><span class="pre">npm</span> <span class="pre">install</span></tt>
and then <tt class="docutils literal"><span class="pre">grunt</span> <span class="pre">fetch</span></tt>).</p> and then <tt class="docutils literal"><span class="pre">grunt</span> <span class="pre">fetch</span></tt>).</p>
...@@ -512,13 +512,22 @@ production site.</p> ...@@ -512,13 +512,22 @@ production site.</p>
<p>To minify the Javascript and CSS, run the following command:</p> <p>To minify the Javascript and CSS, run the following command:</p>
<div class="highlight-python"><pre>grunt minify</pre> <div class="highlight-python"><pre>grunt minify</pre>
</div> </div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Since release 0.6.0, I&#8217;m using <a class="reference external" href="https://github.com/jrburke/almond">almond</a>
instead of <a class="reference external" href="http://requirejs.org">require.js</a>. The
<a class="reference external" href="https://github.com/gruntjs/grunt-contrib-requirejs">grunt-contrib-requirejs</a>
plugin however doesn&#8217;t support <em>almond</em>. I therefore now build it manually
(the old way again), like this: <tt class="docutils literal"><span class="pre">r.js</span> <span class="pre">-o</span> <span class="pre">build.js</span></tt>. CSS can be minimized
separately via <tt class="docutils literal"><span class="pre">grunt</span> <span class="pre">cssmin</span></tt>.</p>
</div>
<p>Javascript will be bundled and minified via <a class="reference external" href="http://requirejs.org">require.js</a>&#8216;s optimization tool. <p>Javascript will be bundled and minified via <a class="reference external" href="http://requirejs.org">require.js</a>&#8216;s optimization tool.
You can <a class="reference external" href="http://requirejs.org/docs/optimization.html">read more about require.js&#8217;s optimizer here</a>.</p> You can <a class="reference external" href="http://requirejs.org/docs/optimization.html">read more about require.js&#8217;s optimizer here</a>.</p>
<p>CSS is minified via <a class="reference external" href="https://github.com/gruntjs/grunt-contrib-cssmin">cssmin</a>.</p> <p>CSS is minified via <a class="reference external" href="https://github.com/gruntjs/grunt-contrib-cssmin">cssmin</a>.</p>
</div> </div>
</div> </div>
<div class="section" id="translations"> <div class="section" id="translations">
<h1><a class="toc-backref" href="#id35">Translations</a><a class="headerlink" href="#translations" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id36">Translations</a><a class="headerlink" href="#translations" title="Permalink to this headline"></a></h1>
<div class="admonition note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Translations take up a lot of space and will bloat your minified file. <p class="last">Translations take up a lot of space and will bloat your minified file.
...@@ -604,7 +613,7 @@ those hoops you had to jump through.</p> ...@@ -604,7 +613,7 @@ those hoops you had to jump through.</p>
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index" <a href="genindex.html" title="General Index"
>index</a></li> >index</a></li>
<li><a href="#">Converse.js 0.5.3 documentation</a> &raquo;</li> <li><a href="#">Converse.js 0.6.0 documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
</div> </div>
......
# Sphinx inventory version 2 # Sphinx inventory version 2
# Project: Converse.js # Project: Converse.js
# Version: 0.5.3 # Version: 0.6.0
# The remainder of this file is compressed using zlib. # The remainder of this file is compressed using zlib.
xm xm
{"]; {"];
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &mdash; Converse.js 0.5.3 documentation</title> <title>Search &mdash; Converse.js 0.6.0 documentation</title>
<link rel="stylesheet" href="_static/stylesheet.css" type="text/css" /> <link rel="stylesheet" href="_static/stylesheet.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<script type="text/javascript"> <script type="text/javascript">
var DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT: '', URL_ROOT: '',
VERSION: '0.5.3', VERSION: '0.6.0',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html', FILE_SUFFIX: '.html',
HAS_SOURCE: true HAS_SOURCE: true
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
<script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script> <script type="text/javascript" src="_static/searchtools.js"></script>
<link rel="top" title="Converse.js 0.5.3 documentation" href="index.html" /> <link rel="top" title="Converse.js 0.6.0 documentation" href="index.html" />
<script type="text/javascript"> <script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); }); jQuery(function() { Search.loadIndex("searchindex.js"); });
</script> </script>
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index" <a href="genindex.html" title="General Index"
accesskey="I">index</a></li> accesskey="I">index</a></li>
<li><a href="index.html">Converse.js 0.5.3 documentation</a> &raquo;</li> <li><a href="index.html">Converse.js 0.6.0 documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
<section id="main_content" class="inner"> <section id="main_content" class="inner">
...@@ -100,7 +100,7 @@ ...@@ -100,7 +100,7 @@
<li class="right" style="margin-right: 10px"> <li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index" <a href="genindex.html" title="General Index"
>index</a></li> >index</a></li>
<li><a href="index.html">Converse.js 0.5.3 documentation</a> &raquo;</li> <li><a href="index.html">Converse.js 0.6.0 documentation</a> &raquo;</li>
</ul> </ul>
</div> </div>
</div> </div>
......
Search.setIndex({objects:{},terms:{all:0,code:0,partial:0,queri:0,webchat:0,follow:0,middl:0,depend:0,sensit:0,punjab:0,present:0,under:0,spec:0,string:0,fals:0,account:0,facebook:0,jack:0,veri:0,tri:0,chatpanel:0,list:0,sane:0,div:0,pleas:0,prevent:0,past:0,second:0,pass:0,download:0,further:0,fullnam:0,click:0,even:0,index:0,what:0,hide:0,section:0,current:0,"public":0,version:0,"new":0,net:0,method:0,widget:0,themselv:0,gener:0,here:0,bodi:0,let:0,strong:0,modifi:0,valu:0,box:0,great:0,convers:0,ajax:0,fetch:0,implement:0,sorri:0,via:0,repositori:0,extra:0,solut:0,prefer:0,put:0,href:0,org:0,auto_list_room:0,instal:0,should:0,getsess:0,from:0,zip:0,commun:0,doubl:0,two:0,websit:0,few:0,stylesheet:0,call:0,recommend:0,type:0,until:0,toggl:0,more:0,peopl:0,notic:0,site:0,particular:0,vcard:0,must:0,none:0,room:0,work:0,xhr:0,can:0,lc_messag:0,purpos:0,root:0,blogpost:0,control:0,quickstart:0,give:0,share:0,templat:0,tag:0,proprietari:0,explor:0,onlin:0,occup:0,end:0,goal:0,thing:0,write:0,how:0,sid:0,roster:0,instead:0,css:0,updat:0,npm:0,regener:0,product:0,resourc:0,after:0,usabl:0,befor:0,underscor:0,data:0,demonstr:0,man:0,"short":0,practic:0,bind:0,show_controlbox_by_default:0,element:0,caus:0,inform:0,parti:0,mechan:0,order:0,feedback:0,chatbox:0,xmpp:0,over:0,becaus:0,through:0,streamlin:0,snippet:0,jid:0,"8147a27e4a7f9b55ffc85c2683f9529a":0,directli:0,fit:0,fix:0,"static":0,pend:0,hidden:0,therefor:0,might:0,them:0,anim:0,"return":0,thei:0,initi:0,front:0,now:0,introduct:0,edit:0,authent:0,token:0,ejabberd:0,each:0,debug:0,side:0,mean:0,domain:0,individu:0,realli:0,legwork:0,connect:0,happen:0,extract:0,special:0,variabl:0,shown:0,"3rd":0,space:0,miss:0,content:0,rel:0,internet:0,plural:0,factori:0,po2json:0,proxi:0,insid:0,standard:0,standalon:0,reason:0,releas:0,succesfulli:0,afterward:0,could:0,ask:0,keep:0,turn:0,first:0,origin:0,softwar:0,render:0,onc:0,hoop:0,lastnam:0,number:0,yourself:0,restrict:0,instruct:0,alreadi:0,done:0,submit:0,owner:0,custom:0,jabber:0,differ:0,script:0,top:0,attack:0,messag:0,attach:0,stori:0,master:0,jed:0,jcbrand:0,"final":0,luckili:0,consol:0,option:0,tool:0,specifi:0,github:0,pars:0,grunt:0,haven:0,serv:0,jump:0,kind:0,bloat:0,provid:0,remov:0,exampl:0,bridg:0,browser:0,pre:0,"function":0,saa:0,modern:0,ani:0,packag:0,have:0,tabl:0,need:0,moffitt:0,django:0,bosh_service_url:0,prebind:0,min:0,latter:0,note:0,also:0,contact:0,take:0,which:0,singl:0,sure:0,though:0,unsur:0,who:0,most:0,deploi:0,homepag:0,"class":0,don:0,url:0,request:0,doe:0,part:0,runtim:0,bower:0,usual:0,xdomainrequest:0,devdepend:0,show:0,german:0,text:0,session:0,fine:0,find:0,help:0,onli:0,exactli:0,locat:0,just:0,configur:0,apach:0,than:0,folder:0,local:0,meant:0,count:0,get:0,soon:0,opkod:0,nativ:0,cannot:0,requir:0,enabl:0,emb:0,mainspec:0,patch:0,reload:0,bad:0,integr:0,contain:0,where:0,set:0,habit:0,stroph:0,see:0,close:0,page:0,statu:0,said:0,kei:0,state:0,between:0,experi:0,jasmin:0,hide_muc_serv:0,attribut:0,appreci:0,extend:0,screen:0,javascript:0,style:0,job:0,bosh:0,"5e64a30272af065bd72258c565a03f2f":0,both:0,cor:0,instant:0,shortliv:0,conversej:0,myself:0,etc:0,grain:0,mani:0,login:0,com:0,load:0,pot:0,backend:0,quit:0,sucessfulli:0,addition:0,rebuild:0,compon:0,json:0,much:0,subscrib:0,blob:0,session_kei:0,convert:0,minifi:0,togeth:0,i18n:0,those:0,multi:0,main:0,look:0,servic:0,plugin:0,defin:0,abov:0,error:0,hightlight:0,chat:0,helper:0,demo:0,auto_subscrib:0,non:0,rid:0,conn:0,develop:0,open:0,receiv:0,media:0,make:0,minif:0,cross:0,same:0,read:0,onconnectfacebook:0,html:0,chatroom:0,document:0,medit:0,complet:0,signon:0,http:0,webserv:0,optim:0,upon:0,someon:0,hand:0,"50kb":0,user:0,xhr_user_search:0,cssmin:0,recent:0,stateless:0,markup:0,well:0,without:0,command:0,wherebi:0,thi:0,choos:0,latest:0,plural_form:0,protocol:0,firstnam:0,tip:0,jshint:0,languag:0,web:0,xmlhttprequest:0,had:0,add:0,other:0,non_amd:0,input:0,match:0,applic:0,format:0,webpag:0,amd:0,nginx:0,traffic:0,know:0,background:0,like:0,xss:0,backbon:0,specif:0,server:0,collect:0,benefit:0,either:0,output:0,manag:0,facebookconnect:0,deal:0,nplural:0,some:0,back:0,librari:0,bottom:0,deploy:0,achiev:0,track:0,overcom:0,localhost:0,refer:0,object:0,run:0,host:0,although:0,panel:0,src:0,about:0,controlbox:0,unfortun:0,act:0,own:0,curiou:0,encod:0,automat:0,wrap:0,your:0,merg:0,log:0,wai:0,transfer:0,support:0,"long":0,happi:0,avail:0,includ:0,lot:0,suit:0,analysi:0,head:0,properli:0,form:0,bundl:0,link:0,translat:0,synonym:0,line:0,inlin:0,"true":0,bug:0,congratul:0,longer:0,info:0,pull:0,made:0,dirti:0,locale_data:0,possibl:0,"default":0,bugfix:0,displai:0,asynchron:0,below:0,tightli:0,otherwis:0,problem:0,expect:0,featur:0,creat:0,doesn:0,msgmerg:0,exist:0,file:0,face:0,check:0,want:0,when:0,detail:0,gettext:0,field:0,valid:0,rememb:0,test:0,you:0,nice:0,node:0,intend:0,stai:0,lang:0,requirej:0,directori:0,getjson:0,potenti:0,time:0},objtypes:{},titles:["Quickstart (to get a demo up and running)"],objnames:{},filenames:["index"]}) Search.setIndex({objects:{},terms:{all:0,code:0,partial:0,queri:0,webchat:0,follow:0,middl:0,depend:0,sensit:0,punjab:0,those:0,under:0,spec:0,string:0,fals:0,account:0,facebook:0,jack:0,veri:0,tri:0,chatpanel:0,list:0,sane:0,div:0,pleas:0,prevent:0,almond:0,past:0,second:0,pass:0,download:0,further:0,fullnam:0,click:0,even:0,index:0,what:0,hide:0,section:0,current:0,version:0,"new":0,net:0,"public":0,widget:0,themselv:0,gener:0,here:0,bodi:0,let:0,strong:0,modifi:0,sinc:0,valu:0,box:0,great:0,convers:0,reason:0,fetch:0,implement:0,sorri:0,via:0,although:0,extra:0,apach:0,prefer:0,ask:0,href:0,succesfulli:0,auto_list_room:0,instal:0,getsess:0,from:0,zip:0,commun:0,doubl:0,two:0,websit:0,few:0,stylesheet:0,call:0,recommend:0,type:0,until:0,toggl:0,more:0,peopl:0,notic:0,particular:0,vcard:0,must:0,none:0,room:0,work:0,xhr:0,can:0,lc_messag:0,purpos:0,root:0,blogpost:0,control:0,quickstart:0,give:0,share:0,templat:0,tag:0,proprietari:0,explor:0,onlin:0,unfortun:0,occup:0,end:0,goal:0,turn:0,snippet:0,how:0,sid:0,instead:0,css:0,updat:0,npm:0,regener:0,product:0,resourc:0,haven:0,after:0,usabl:0,befor:0,underscor:0,data:0,demonstr:0,man:0,github:0,practic:0,bind:0,show_controlbox_by_default:0,django:0,caus:0,inform:0,media:0,mechan:0,order:0,feedback:0,chatbox:0,xmpp:0,over:0,becaus:0,through:0,streamlin:0,write:0,jid:0,"8147a27e4a7f9b55ffc85c2683f9529a":0,directli:0,fit:0,fix:0,pend:0,hidden:0,therefor:0,might:0,them:0,anim:0,"return":0,thei:0,initi:0,front:0,now:0,introduct:0,edit:0,authent:0,separ:0,token:0,ejabberd:0,each:0,debug:0,side:0,mean:0,domain:0,"short":0,individu:0,realli:0,wrap:0,"static":0,connect:0,happen:0,extract:0,special:0,variabl:0,shown:0,"3rd":0,space:0,miss:0,content:0,method:0,rel:0,internet:0,plural:0,factori:0,po2json:0,proxi:0,insid:0,standard:0,standalon:0,ajax:0,put:0,org:0,afterward:0,could:0,keep:0,thing:0,first:0,origin:0,softwar:0,render:0,onc:0,hoop:0,lastnam:0,number:0,yourself:0,restrict:0,instruct:0,alreadi:0,done:0,"long":0,owner:0,happi:0,jabber:0,differ:0,script:0,top:0,attack:0,messag:0,attach:0,stori:0,master:0,jed:0,jcbrand:0,"final":0,luckili:0,consol:0,option:0,tool:0,specifi:0,part:0,pars:0,grunt:0,than:0,serv:0,jump:0,kind:0,bloat:0,provid:0,remov:0,exampl:0,bridg:0,browser:0,pre:0,analysi:0,saa:0,modern:0,ani:0,packag:0,have:0,tabl:0,need:0,moffitt:0,element:0,bosh_service_url:0,prebind:0,min:0,latter:0,note:0,also:0,contact:0,take:0,which:0,singl:0,sure:0,though:0,unsur:0,who:0,most:0,deploi:0,homepag:0,"class":0,don:0,url:0,request:0,doe:0,runtim:0,bower:0,latest:0,xdomainrequest:0,devdepend:0,show:0,german:0,text:0,session:0,fine:0,find:0,help:0,onli:0,exactli:0,locat:0,firstnam:0,configur:0,solut:0,should:0,folder:0,local:0,meant:0,info:0,get:0,soon:0,opkod:0,nativ:0,cannot:0,deploy:0,requir:0,enabl:0,emb:0,mainspec:0,multi:0,patch:0,reload:0,bad:0,integr:0,contain:0,where:0,set:0,habit:0,stroph:0,see:0,close:0,statu:0,said:0,extend:0,state:0,between:0,experi:0,jasmin:0,screen:0,attribut:0,appreci:0,kei:0,hide_muc_serv:0,javascript:0,style:0,job:0,bosh:0,otherwis:0,"5e64a30272af065bd72258c565a03f2f":0,both:0,cor:0,instant:0,shortliv:0,conversej:0,etc:0,grain:0,mani:0,login:0,com:0,load:0,pot:0,non:0,backend:0,quit:0,sucessfulli:0,addition:0,rebuild:0,compon:0,json:0,much:0,subscrib:0,non_amd:0,session_kei:0,convert:0,minifi:0,togeth:0,i18n:0,present:0,myself:0,main:0,look:0,servic:0,plugin:0,defin:0,abov:0,error:0,howev:0,hightlight:0,file:0,helper:0,demo:0,auto_subscrib:0,site:0,rid:0,conn:0,develop:0,open:0,minim:0,receiv:0,parti:0,make:0,minif:0,cross:0,same:0,webpag:0,onconnectfacebook:0,html:0,chatroom:0,document:0,medit:0,complet:0,signon:0,http:0,webserv:0,optim:0,upon:0,someon:0,hand:0,"50kb":0,user:0,xhr_user_search:0,cssmin:0,recent:0,stateless:0,markup:0,well:0,without:0,command:0,wherebi:0,thi:0,choos:0,usual:0,plural_form:0,protocol:0,just:0,when:0,jshint:0,languag:0,web:0,xmlhttprequest:0,had:0,add:0,valid:0,blob:0,input:0,match:0,build:0,applic:0,format:0,read:0,amd:0,nginx:0,traffic:0,know:0,background:0,backbon:0,xss:0,like:0,specif:0,manual:0,server:0,collect:0,benefit:0,either:0,output:0,manag:0,facebookconnect:0,old:0,deal:0,nplural:0,some:0,back:0,librari:0,bottom:0,roster:0,achiev:0,track:0,overcom:0,localhost:0,refer:0,object:0,run:0,host:0,repositori:0,panel:0,src:0,about:0,controlbox:0,page:0,act:0,own:0,curiou:0,encod:0,automat:0,contrib:0,your:0,merg:0,log:0,wai:0,transfer:0,support:0,submit:0,custom:0,avail:0,includ:0,lot:0,suit:0,"function":0,head:0,properli:0,form:0,bundl:0,link:0,translat:0,synonym:0,line:0,inlin:0,"true":0,bug:0,congratul:0,requirej:0,count:0,pull:0,made:0,dirti:0,locale_data:0,possibl:0,"default":0,bugfix:0,displai:0,asynchron:0,below:0,tightli:0,legwork:0,problem:0,expect:0,featur:0,creat:0,doesn:0,msgmerg:0,exist:0,chat:0,face:0,check:0,again:0,want:0,tip:0,detail:0,gettext:0,field:0,other:0,rememb:0,test:0,you:0,nice:0,node:0,intend:0,releas:0,stai:0,lang:0,longer:0,directori:0,getjson:0,potenti:0,time:0},objtypes:{},titles:["Quickstart (to get a demo up and running)"],objnames:{},filenames:["index"]})
\ No newline at end of file \ No newline at end of file
...@@ -48,9 +48,9 @@ copyright = u'2013, JC Brand' ...@@ -48,9 +48,9 @@ copyright = u'2013, JC Brand'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '0.6.0' version = '0.6.2'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.6.0' release = '0.6.2'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.
......
...@@ -553,6 +553,14 @@ To minify the Javascript and CSS, run the following command: ...@@ -553,6 +553,14 @@ To minify the Javascript and CSS, run the following command:
grunt minify grunt minify
.. Note ::
Since release 0.6.0, I'm using `almond <https://github.com/jrburke/almond>`_
instead of `require.js <http://requirejs.org>`_. The
`grunt-contrib-requirejs <https://github.com/gruntjs/grunt-contrib-requirejs>`_
plugin however doesn't support *almond*. I therefore now build it manually
(the old way again), like this: ``r.js -o build.js``. CSS can be minimized
separately via ``grunt cssmin``.
Javascript will be bundled and minified via `require.js`_'s optimization tool. Javascript will be bundled and minified via `require.js`_'s optimization tool.
You can `read more about require.js's optimizer here`_. You can `read more about require.js's optimizer here`_.
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
<link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css"> <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">
<link rel="stylesheet" type="text/css" media="screen" href="converse.css"> <link rel="stylesheet" type="text/css" media="screen" href="converse.css">
<script data-main="main" src="components/requirejs/require.js"></script> <script data-main="main" src="components/requirejs/require.js"></script>
<!-- <script src="converse.min.js"></script>-->
<title>Converse.js</title> <title>Converse.js</title>
</head> </head>
...@@ -18,8 +19,8 @@ ...@@ -18,8 +19,8 @@
<h1 id="project_title"><a href="http://conversejs.org">Converse.js</a></h1> <h1 id="project_title"><a href="http://conversejs.org">Converse.js</a></h1>
<h2 id="project_tagline">An XMPP chat client for your website</h2> <h2 id="project_tagline">An XMPP chat client for your website</h2>
<section id="downloads"> <section id="downloads">
<a class="zip_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.5.2.zip">Download the latest release as a .zip file</a> <a class="zip_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.6.2.zip">Download the latest release as a .zip file</a>
<a class="tar_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.5.2.tar.gz">Download the latest release as a tar.gz file</a> <a class="tar_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.6.2.tar.gz">Download the latest release as a tar.gz file</a>
</section> </section>
</header> </header>
</div> </div>
...@@ -35,18 +36,10 @@ ...@@ -35,18 +36,10 @@
<p><em>Converse.js</em> can connect to any accessible <a href="http://xmpp.org" target="_blank">XMPP/Jabber</a> server, either from a public provider such as <a href="http://jabber.org">jabber.org</a>, or to one you have set up yourself.</p> <p><em>Converse.js</em> can connect to any accessible <a href="http://xmpp.org" target="_blank">XMPP/Jabber</a> server, either from a public provider such as <a href="http://jabber.org">jabber.org</a>, or to one you have set up yourself.</p>
<p>It's possible to enable single-site login, whereby users already authenticated in your website will also automatically be logged in on the chat server, <p>It's possible to enable single-site-login, whereby users already authenticated in your website will also automatically be logged in on the chat server,
but you will have to pre-authenticate them on your server. You can refer to the <a href="/docs/html/index.html">documentation</a> for more but you will have to pre-authenticate them on your server. You can refer to the <a href="/docs/html/index.html">documentation</a> for more
info.</p> info.</p>
<p>An <a href="http://github.com/collective/collective.xmpp.chat" target="_blank">add-on product</a> that does exactly this,
already exists for the <a href="http://plone.org" target="_blank">Plone</a> CMS. Hopefully in the future more such add-ons will
be created for other platforms.
</p>
<p>If you have integrated <em>Converse.js</em> into any other CMS or framework,
<a href="http://opkode.com/contact.html" target="_blank">please let me know</a> and I'll mention it on this page.</p>
<h2>Features</h2> <h2>Features</h2>
<ul> <ul>
<li>Single-user chat</li> <li>Single-user chat</li>
...@@ -61,7 +54,7 @@ ...@@ -61,7 +54,7 @@
<li>Custom status messages</li> <li>Custom status messages</li>
<li>Typing notifications</li> <li>Typing notifications</li>
<li>Third person messages (/me )</li> <li>Third person messages (/me )</li>
<li>Translated into multiple languages (af, de, es, it, pt_BR)</li> <li>Translated into multiple languages (af, de, es, it, pt-BR)</li>
</ul> </ul>
<h2>Screencasts</h2> <h2>Screencasts</h2>
...@@ -74,6 +67,30 @@ ...@@ -74,6 +67,30 @@
</li> </li>
</ul> </ul>
<h2>Integration into other frameworks</h2>
<ul>
<li><h4><a href="http://plone.org" target="_blank">Plone</a></h4>
<strong><a href="http://github.com/collective/collective.xmpp.chat" target="_blank">collective.xmpp.chat</a></strong>
is an add-on for Plone that uses <em>Converse.js</em>.
Together with <a href="http://github.com/collective/collective.xmpp.core" target="_blank">collective.xmpp.core</a>, it provides for single-signon-support (SSO)
and also enables you to manually or automatically
register your Plone users onto your XMPP server.
</li>
<li><h4><a href="http://www.djangoproject.com" target="_blank">Django</a></h4>
<strong><a href="https://pypi.python.org/pypi/django-conversejs" target="_blank">django-conversejs</a></strong> is an app that makes it easer to integrate <em>Converse.js</em>
into Django. It adds single-signon-support (SSO) support and a database model to store XMPP credentials.
</li>
<li><h4><a href="http://roundcube.net" target="_blank">Roundcube</a></h4>
<strong><a href="https://github.com/priyadi/roundcube-converse.js-xmpp-plugin" target="_blank">roundcube-converse.js-xmpp-plugin</a></strong>
is a plugin for Roundcube Webmail. It's README states that it's still a work in progress.
</li>
</ul>
<p>If you have integrated <em>Converse.js</em> into any other CMS or framework,
<a href="http://opkode.com/contact.html" target="_blank">please let me know</a> and I'll mention it on this page.</p>
<h2>Demo</h2> <h2>Demo</h2>
<p>You can log in with any existing XMPP account. There is also a list of public XMPP providers on <a href="http://xmpp.net" target="_blank">xmpp.net</a>.</p> <p>You can log in with any existing XMPP account. There is also a list of public XMPP providers on <a href="http://xmpp.net" target="_blank">xmpp.net</a>.</p>
<p><em><strong>Note:</strong> currently the demo doesn't work in Internet Explorer older <p><em><strong>Note:</strong> currently the demo doesn't work in Internet Explorer older
...@@ -83,10 +100,29 @@ ...@@ -83,10 +100,29 @@
See <a href="/docs/html/index.html#overcoming-cross-domain-request-restrictions" target="_blank">here</a> for more information.</p></em> See <a href="/docs/html/index.html#overcoming-cross-domain-request-restrictions" target="_blank">here</a> for more information.</p></em>
<h3>Is it secure?</h3> <h3>Is it secure?</h3>
<p>Yes. In this demo <em>Converse.js</em> makes an <p>
<a href="https://en.wikipedia.org/wiki/Secure_Sockets_Layer" target="_blank">SSL</a> encrypted connection to a secure connection manager. Yes, as long as you can trust that the Javascript being downloaded is
The connection manager then uses SSL and <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> to connect to an XMPP server.</p> not being tampered with. This page itself is served by Github and is not <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS/TLS</a>
That said, the developers don't assume any liability for any loss or damages as a result of using this software or demo. Use this demo at your own risk. encrypted (i.e. served via <a href="https://en.wikipedia.org/wiki/HTTPS">HTTPS</a>).
I don't know how probable it is that Github served pages could be hacked to
insert malicious Javascript.
</p>
<p>
Ideally you'd want your site to be served encrypted via HTTPS.
In this case, use with caution. You can of course go
download the source from Github and run this page locally, removing
the attack vector altogether.
</p>
<p>
<em>Converse.js</em> itself makes encrypted HTTPS requests to a <em>connection manager</em>, which will make an
SSL/TLS encrypted connection to an XMPP server (if the server supports it).
</p>
<p>
Logging in happens via <a href="https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer">SASL</a>.
</p>
<p>
That said, the developers don't assume any liability for any loss or damages as a result of using this software or demo. Use at your own risk.
</p>
<h3>Session support</h3> <h3>Session support</h3>
<p> <p>
...@@ -119,19 +155,16 @@ ...@@ -119,19 +155,16 @@
<li><a href="http://backbonejs.org" target="_blank">backbone.js</a></li> <li><a href="http://backbonejs.org" target="_blank">backbone.js</a></li>
<li><a href="http://requirejs.org" target="_blank">require.js</a> (optional dependency)</li> <li><a href="http://requirejs.org" target="_blank">require.js</a> (optional dependency)</li>
</ul> </ul>
<p>Some images were taken from <a href="http://plone.org" target="_blank">Plone</a> and the
<a href="http://openiconlibrary.sourceforge.net" target="_blank">Open Icon Library</a>.
<h2>Licence</h2> <h2>Licence</h2>
<p><strong>Converse.js</strong> is released under both the <a href="http://opensource.org/licenses/mit-license.php" target="_blank">MIT</a> <p><strong>Converse.js</strong> is released under both the <a href="http://opensource.org/licenses/mit-license.php" target="_blank">MIT</a>
and <a href="http://opensource.org/licenses/GPL-2.0" target="_blank">GPL</a> licenses.</p> and <a href="http://opensource.org/licenses/GPL-2.0" target="_blank">GPL</a> licenses.</p>
<h2>Contact</h2> <h2>Contact</h2>
<p>You can follow me on <strong><a href="http://twitter.com/jcopkode" target="_blank">Twitter</a></strong> and <strong><a href="http://identi.ca/opkode" target="_blank">Identica</a></strong></p> <p>You can follow me on <strong><a href="http://twitter.com/jcopkode" target="_blank">Twitter</a></strong></p>
<p>My XMPP username is <strong>jc@opkode.im</strong>.</p> <p>My XMPP username is <strong>jc@opkode.im</strong>.</p>
<p>Send me an email via this <a href="http://opkode.com/contact" target="_blank">contact form</a>.</p> <p>Send me an email via this <a href="http://opkode.com/contact" target="_blank">contact form</a>.</p>
</section> </section>
</div> </div>
<!-- FOOTER --> <!-- FOOTER -->
...@@ -163,11 +196,11 @@ ...@@ -163,11 +196,11 @@
auto_subscribe: false, auto_subscribe: false,
bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
hide_muc_server: false, hide_muc_server: false,
i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported i18n: locales['fr'], // Refer to ./locale/locales.js to see which locales are supported
prebind: false, prebind: false,
show_controlbox_by_default: true, show_controlbox_by_default: true,
xhr_user_search: false, xhr_user_search: false,
debug: true debug: true
}); });
}); });
</script> </script>
......
...@@ -8,7 +8,7 @@ msgid "" ...@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Converse.js 0.4\n" "Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 23:03+0200\n" "POT-Creation-Date: 2013-08-26 16:15+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
...@@ -17,465 +17,445 @@ msgstr "" ...@@ -17,465 +17,445 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: converse.js:397 converse.js:1128 #: converse.js:130
msgid "Disconnected"
msgstr ""
#: converse.js:134
msgid "Error"
msgstr ""
#: converse.js:136
msgid "Connecting"
msgstr ""
#: converse.js:139
msgid "Connection Failed"
msgstr ""
#: converse.js:141
msgid "Authenticating"
msgstr ""
#: converse.js:144
msgid "Authentication Failed"
msgstr ""
#: converse.js:146
msgid "Disconnecting"
msgstr ""
#: converse.js:456 converse.js:1175
msgid "Show this menu" msgid "Show this menu"
msgstr "" msgstr ""
#: converse.js:398 converse.js:1129 #: converse.js:457 converse.js:1176
msgid "Write in the third person" msgid "Write in the third person"
msgstr "" msgstr ""
#: converse.js:399 converse.js:1133 #: converse.js:458 converse.js:1180
msgid "Remove messages" msgid "Remove messages"
msgstr "" msgstr ""
#: converse.js:539 #: converse.js:598
msgid "Personal message" msgid "Personal message"
msgstr "" msgstr ""
#: converse.js:613 #: converse.js:672
msgid "Contacts" msgid "Contacts"
msgstr "" msgstr ""
#: converse.js:618 #: converse.js:677
msgid "Online" msgid "Online"
msgstr "" msgstr ""
#: converse.js:619 #: converse.js:678
msgid "Busy" msgid "Busy"
msgstr "" msgstr ""
#: converse.js:620 #: converse.js:679
msgid "Away" msgid "Away"
msgstr "" msgstr ""
#: converse.js:621 #: converse.js:680
msgid "Offline" msgid "Offline"
msgstr "" msgstr ""
#: converse.js:628 #: converse.js:687
msgid "Click to add new chat contacts" msgid "Click to add new chat contacts"
msgstr "" msgstr ""
#: converse.js:628 #: converse.js:688
msgid "Add a contact" msgid "Add a contact"
msgstr "" msgstr ""
#: converse.js:637 #: converse.js:697
msgid "Contact username" msgid "Contact username"
msgstr "" msgstr ""
#: converse.js:638 #: converse.js:698
msgid "Add" msgid "Add"
msgstr "" msgstr ""
#: converse.js:646 #: converse.js:706
msgid "Contact name" msgid "Contact name"
msgstr "" msgstr ""
#: converse.js:647 #: converse.js:707
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: converse.js:682 #: converse.js:747
msgid "No users found" msgid "No users found"
msgstr "" msgstr ""
#: converse.js:689 #: converse.js:754
msgid "Click to add as a chat contact" msgid "Click to add as a chat contact"
msgstr "" msgstr ""
#: converse.js:753 #: converse.js:814
msgid "Click to open this room" msgid "Click to open this room"
msgstr "" msgstr ""
#: converse.js:755 #: converse.js:816
msgid "Show more information on this room" msgid "Show more information on this room"
msgstr "" msgstr ""
#: converse.js:760 #: converse.js:822
msgid "Description:" msgid "Description:"
msgstr "" msgstr ""
#: converse.js:761 #: converse.js:823
msgid "Occupants:" msgid "Occupants:"
msgstr "" msgstr ""
#: converse.js:762 #: converse.js:824
msgid "Features:" msgid "Features:"
msgstr "" msgstr ""
#: converse.js:764 #: converse.js:826
msgid "Requires authentication" msgid "Requires authentication"
msgstr "" msgstr ""
#: converse.js:767 #: converse.js:829
msgid "Hidden" msgid "Hidden"
msgstr "" msgstr ""
#: converse.js:770 #: converse.js:832
msgid "Requires an invitation" msgid "Requires an invitation"
msgstr "" msgstr ""
#: converse.js:773 #: converse.js:835
msgid "Moderated" msgid "Moderated"
msgstr "" msgstr ""
#: converse.js:776 #: converse.js:838
msgid "Non-anonymous" msgid "Non-anonymous"
msgstr "" msgstr ""
#: converse.js:779 #: converse.js:841
msgid "Open room" msgid "Open room"
msgstr "" msgstr ""
#: converse.js:782 #: converse.js:844
msgid "Permanent room" msgid "Permanent room"
msgstr "" msgstr ""
#: converse.js:785 #: converse.js:847
msgid "Public" msgid "Public"
msgstr "" msgstr ""
#: converse.js:788 #: converse.js:850
msgid "Semi-anonymous" msgid "Semi-anonymous"
msgstr "" msgstr ""
#: converse.js:791 #: converse.js:853
msgid "Temporary room" msgid "Temporary room"
msgstr "" msgstr ""
#: converse.js:794 #: converse.js:856
msgid "Unmoderated" msgid "Unmoderated"
msgstr "" msgstr ""
#: converse.js:800 #: converse.js:862
msgid "Rooms" msgid "Rooms"
msgstr "" msgstr ""
#: converse.js:804 #: converse.js:866
msgid "Room name" msgid "Room name"
msgstr "" msgstr ""
#: converse.js:805 #: converse.js:867
msgid "Nickname" msgid "Nickname"
msgstr "" msgstr ""
#: converse.js:806 #: converse.js:868
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: converse.js:807 #: converse.js:869
msgid "Join" msgid "Join"
msgstr "" msgstr ""
#: converse.js:808 #: converse.js:870
msgid "Show rooms" msgid "Show rooms"
msgstr "" msgstr ""
#. For translators: %1$s is a variable and will be replaced with the XMPP server name #. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:841 #: converse.js:905
msgid "No rooms on %1$s" msgid "No rooms on %1$s"
msgstr "" msgstr ""
#. For translators: %1$s is a variable and will be #. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name #. replaced with the XMPP server name
#: converse.js:856 #: converse.js:920
msgid "Rooms on %1$s" msgid "Rooms on %1$s"
msgstr "" msgstr ""
#: converse.js:1130 #: converse.js:1177
msgid "Set chatroom topic" msgid "Set chatroom topic"
msgstr "" msgstr ""
#: converse.js:1131 #: converse.js:1178
msgid "Kick user from chatroom" msgid "Kick user from chatroom"
msgstr "" msgstr ""
#: converse.js:1132 #: converse.js:1179
msgid "Ban user from chatroom" msgid "Ban user from chatroom"
msgstr "" msgstr ""
#: converse.js:1159 #: converse.js:1206
msgid "Message" msgid "Message"
msgstr "" msgstr ""
#: converse.js:1273 converse.js:2318 #: converse.js:1320 converse.js:2387
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: converse.js:1274 #: converse.js:1321
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: converse.js:1321 #: converse.js:1368
msgid "An error occurred while trying to save the form." msgid "An error occurred while trying to save the form."
msgstr "" msgstr ""
#: converse.js:1367 #: converse.js:1414
msgid "This chatroom requires a password" msgid "This chatroom requires a password"
msgstr "" msgstr ""
#: converse.js:1368 #: converse.js:1415
msgid "Password: " msgid "Password: "
msgstr "" msgstr ""
#: converse.js:1369 #: converse.js:1416
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: converse.js:1383 #: converse.js:1430
msgid "This room is not anonymous" msgid "This room is not anonymous"
msgstr "" msgstr ""
#: converse.js:1384 #: converse.js:1431
msgid "This room now shows unavailable members" msgid "This room now shows unavailable members"
msgstr "" msgstr ""
#: converse.js:1385 #: converse.js:1432
msgid "This room does not show unavailable members" msgid "This room does not show unavailable members"
msgstr "" msgstr ""
#: converse.js:1386 #: converse.js:1433
msgid "Non-privacy-related room configuration has changed" msgid "Non-privacy-related room configuration has changed"
msgstr "" msgstr ""
#: converse.js:1387 #: converse.js:1434
msgid "Room logging is now enabled" msgid "Room logging is now enabled"
msgstr "" msgstr ""
#: converse.js:1388 #: converse.js:1435
msgid "Room logging is now disabled" msgid "Room logging is now disabled"
msgstr "" msgstr ""
#: converse.js:1389 #: converse.js:1436
msgid "This room is now non-anonymous" msgid "This room is now non-anonymous"
msgstr "" msgstr ""
#: converse.js:1390 #: converse.js:1437
msgid "This room is now semi-anonymous" msgid "This room is now semi-anonymous"
msgstr "" msgstr ""
#: converse.js:1391 #: converse.js:1438
msgid "This room is now fully-anonymous" msgid "This room is now fully-anonymous"
msgstr "" msgstr ""
#: converse.js:1392 #: converse.js:1439
msgid "A new room has been created" msgid "A new room has been created"
msgstr "" msgstr ""
#: converse.js:1393 #: converse.js:1440
msgid "Your nickname has been changed" msgid "Your nickname has been changed"
msgstr "" msgstr ""
#. For translations: %1$s will be replaced with the user's nickname #: converse.js:1454
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been banned
#: converse.js:1400
msgid "<strong>%1$s</strong> has been banned" msgid "<strong>%1$s</strong> has been banned"
msgstr "" msgstr ""
#. For translations: %1$s will be replaced with the user's nickname #: converse.js:1455
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been kicked out
#: converse.js:1404
msgid "<strong>%1$s</strong> has been kicked out" msgid "<strong>%1$s</strong> has been kicked out"
msgstr "" msgstr ""
#. For translations: %1$s will be replaced with the user's nickname #: converse.js:1456
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
#: converse.js:1408
msgid "<strong>%1$s</strong> has been removed because of an affiliation change" msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr "" msgstr ""
#. For translations: %1$s will be replaced with the user's nickname #: converse.js:1457
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed for not being a member
#: converse.js:1412
msgid "<strong>%1$s</strong> has been removed for not being a member" msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr "" msgstr ""
#: converse.js:1416 converse.js:1478 #: converse.js:1461 converse.js:1521
msgid "You have been banned from this room" msgid "You have been banned from this room"
msgstr "" msgstr ""
#: converse.js:1417 #: converse.js:1462
msgid "You have been kicked from this room" msgid "You have been kicked from this room"
msgstr "" msgstr ""
#: converse.js:1418 #: converse.js:1463
msgid "You have been removed from this room because of an affiliation change" msgid "You have been removed from this room because of an affiliation change"
msgstr "" msgstr ""
#: converse.js:1419 #: converse.js:1464
msgid "" msgid ""
"You have been removed from this room because the room has changed to members-" "You have been removed from this room because the room has changed to members-"
"only and you're not a member" "only and you're not a member"
msgstr "" msgstr ""
#: converse.js:1420 #: converse.js:1465
msgid "" msgid ""
"You have been removed from this room because the MUC (Multi-user chat) " "You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down." "service is being shut down."
msgstr "" msgstr ""
#: converse.js:1476 #: converse.js:1519
msgid "You are not on the member list of this room" msgid "You are not on the member list of this room"
msgstr "" msgstr ""
#: converse.js:1482 #: converse.js:1525
msgid "No nickname was specified" msgid "No nickname was specified"
msgstr "" msgstr ""
#: converse.js:1486 #: converse.js:1529
msgid "You are not allowed to create new rooms" msgid "You are not allowed to create new rooms"
msgstr "" msgstr ""
#: converse.js:1488 #: converse.js:1531
msgid "Your nickname doesn't conform to this room's policies" msgid "Your nickname doesn't conform to this room's policies"
msgstr "" msgstr ""
#: converse.js:1490 #: converse.js:1533
msgid "Your nickname is already taken" msgid "Your nickname is already taken"
msgstr "" msgstr ""
#: converse.js:1492 #: converse.js:1535
msgid "This room does not (yet) exist" msgid "This room does not (yet) exist"
msgstr "" msgstr ""
#: converse.js:1494 #: converse.js:1537
msgid "This room has reached it's maximum number of occupants" msgid "This room has reached it's maximum number of occupants"
msgstr "" msgstr ""
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively #. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World! #. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1571 #: converse.js:1614
msgid "Topic set by %1$s to: %2$s" msgid "Topic set by %1$s to: %2$s"
msgstr "" msgstr ""
#: converse.js:1587 #: converse.js:1630
msgid "This user is a moderator" msgid "This user is a moderator"
msgstr "" msgstr ""
#: converse.js:1590 #: converse.js:1633
msgid "This user can send messages in this room" msgid "This user can send messages in this room"
msgstr "" msgstr ""
#: converse.js:1593 #: converse.js:1636
msgid "This user can NOT send messages in this room" msgid "This user can NOT send messages in this room"
msgstr "" msgstr ""
#: converse.js:1796 #: converse.js:1843
msgid "Click to chat with this contact" msgid "Click to chat with this contact"
msgstr "" msgstr ""
#: converse.js:1797 converse.js:1801 #: converse.js:1845 converse.js:1849
msgid "Click to remove this contact" msgid "Click to remove this contact"
msgstr "" msgstr ""
#: converse.js:2163 #: converse.js:2231
msgid "Contact requests" msgid "Contact requests"
msgstr "" msgstr ""
#: converse.js:2164 #: converse.js:2232
msgid "My contacts" msgid "My contacts"
msgstr "" msgstr ""
#: converse.js:2165 #: converse.js:2233
msgid "Pending contacts" msgid "Pending contacts"
msgstr "" msgstr ""
#: converse.js:2317 #: converse.js:2386
msgid "Custom status" msgid "Custom status"
msgstr "" msgstr ""
#: converse.js:2323 #: converse.js:2392
msgid "Click to change your chat status" msgid "Click to change your chat status"
msgstr "" msgstr ""
#: converse.js:2326 #: converse.js:2396
msgid "Click here to write a custom status message" msgid "Click here to write a custom status message"
msgstr "" msgstr ""
#: converse.js:2355 converse.js:2363 #: converse.js:2425 converse.js:2433
msgid "online" msgid "online"
msgstr "" msgstr ""
#: converse.js:2357 #: converse.js:2427
msgid "busy" msgid "busy"
msgstr "" msgstr ""
#: converse.js:2359 #: converse.js:2429
msgid "away for long" msgid "away for long"
msgstr "" msgstr ""
#: converse.js:2361 #: converse.js:2431
msgid "away" msgid "away"
msgstr "" msgstr ""
#. For translators: the %1$s part gets replaced with the status #. For translators: the %1$s part gets replaced with the status
#. Example, I am online #. Example, I am online
#: converse.js:2375 converse.js:2409 #: converse.js:2445 converse.js:2482
msgid "I am %1$s" msgid "I am %1$s"
msgstr "" msgstr ""
#: converse.js:2480 #: converse.js:2553
msgid "Sign in" msgid "Sign in"
msgstr "" msgstr ""
#: converse.js:2483 #: converse.js:2556
msgid "XMPP/Jabber Username:" msgid "XMPP/Jabber Username:"
msgstr "" msgstr ""
#: converse.js:2485 #: converse.js:2558
msgid "Password:" msgid "Password:"
msgstr "" msgstr ""
#: converse.js:2487 #: converse.js:2560
msgid "Log In" msgid "Log In"
msgstr "" msgstr ""
#: converse.js:2491 #: converse.js:2564
msgid "BOSH Service URL:" msgid "BOSH Service URL:"
msgstr "" msgstr ""
#: converse.js:2503 #: converse.js:2718
msgid "Connected"
msgstr ""
#: converse.js:2507
msgid "Disconnected"
msgstr ""
#: converse.js:2511
msgid "Error"
msgstr ""
#: converse.js:2513
msgid "Connecting"
msgstr ""
#: converse.js:2516
msgid "Connection Failed"
msgstr ""
#: converse.js:2518
msgid "Authenticating"
msgstr ""
#: converse.js:2521
msgid "Authentication Failed"
msgstr ""
#: converse.js:2523
msgid "Disconnecting"
msgstr ""
#: converse.js:2525
msgid "Attached"
msgstr ""
#: converse.js:2656
msgid "Online Contacts" msgid "Online Contacts"
msgstr "" msgstr ""
...@@ -27,12 +27,13 @@ ...@@ -27,12 +27,13 @@
"it", "it",
"pt_BR" "pt_BR"
], function (jed, af, en, es, de, it, pt_BR) { ], function (jed, af, en, es, de, it, pt_BR) {
root.locales = {}; root.locales = {
root.locales.af = af; 'af': af,
root.locales.en = en; 'en': en,
root.locales.es = es; 'es': es,
root.locales.de = de; 'de': de,
root.locales.it = it; 'it': it,
root.locales.pt_BR = pt_BR; 'pt-br': pt_BR
};
}); });
})(this); })(this);
/*
* This file can be used if no locale support is required.
*/
(function (root, factory) {
define("locales", ['jed'], function (Jed) {
var translations = {
"domain": "converse",
"locale_data": {
"converse": {
"": {
"domain": "converse",
"lang": "en",
"plural_forms": "nplurals=2; plural=(n != 1);"
}
}
}
};
root.locales = { 'en': new Jed(translations) };
});
})(this);
...@@ -2,10 +2,10 @@ require.config({ ...@@ -2,10 +2,10 @@ require.config({
paths: { paths: {
"jquery": "components/jquery/jquery", "jquery": "components/jquery/jquery",
"locales": "locale/locales", "locales": "locale/locales",
"tinysort": "components/tinysort/src/jquery.tinysort", "jquery.tinysort": "components/tinysort/src/jquery.tinysort",
"underscore": "components/underscore/underscore", "underscore": "components/underscore/underscore",
"backbone": "components/backbone/backbone", "backbone": "components/backbone/backbone",
"localstorage": "components/backbone.localStorage/backbone.localStorage", "backbone.localStorage": "components/backbone.localStorage/backbone.localStorage",
"strophe": "components/strophe/strophe", "strophe": "components/strophe/strophe",
"strophe.muc": "components/strophe.muc/index", "strophe.muc": "components/strophe.muc/index",
"strophe.roster": "components/strophe.roster/index", "strophe.roster": "components/strophe.roster/index",
...@@ -40,6 +40,6 @@ require.config({ ...@@ -40,6 +40,6 @@ require.config({
} }
}); });
require(["components/requirejs/require", "jquery", "converse"], function(require, $, converse) { require(["jquery", "converse"], function(require, $, converse) {
window.converse = converse; window.converse = converse;
}); });
...@@ -114,13 +114,13 @@ ...@@ -114,13 +114,13 @@
John Smit</a> John Smit</a>
<a class="remove-xmpp-contact icon-remove" title="Click to remove this contact" href="#"></a> <a class="remove-xmpp-contact icon-remove" title="Click to remove this contact" href="#"></a>
</dd> </dd>
<dd class="dnd current-xmpp-contact"> <dd class="away current-xmpp-contact">
<a class="open-chat" title="Click to chat with this contact" href="#"> <a class="open-chat" title="Click to chat with this contact" href="#">
<span class="icon-away" title="this contact is away"></span> <span class="icon-away" title="this contact is away"></span>
Francois Pienaar</a> Francois Pienaar</a>
<a class="remove-xmpp-contact icon-remove" title="Click to remove this contact" href="#"></a> <a class="remove-xmpp-contact icon-remove" title="Click to remove this contact" href="#"></a>
</dd> </dd>
<dd class="busy current-xmpp-contact"> <dd class="dnd current-xmpp-contact">
<a class="open-chat" title="Click to chat with this contact" href="#"> <a class="open-chat" title="Click to chat with this contact" href="#">
<span class="icon-dnd" title="This contact is busy"></span> <span class="icon-dnd" title="This contact is busy"></span>
Gary Teichmann</a> Gary Teichmann</a>
...@@ -196,7 +196,7 @@ ...@@ -196,7 +196,7 @@
<canvas height="33px" width="33px" class="avatar" style="background-color: black"></canvas> <canvas height="33px" width="33px" class="avatar" style="background-color: black"></canvas>
<div class="chat-title"> JC Brand </div> <div class="chat-title"> JC Brand </div>
</a> </a>
<p class="user-custom-message"></p> <p class="user-custom-message" title="10000ft in the air">10000ft in the air</p>
<p></p> <p></p>
</div> </div>
<div class="chat-content"> <div class="chat-content">
...@@ -339,6 +339,19 @@ $(document).ready(function () { ...@@ -339,6 +339,19 @@ $(document).ready(function () {
$(ev.target).parent().parent().siblings('dd').find('ul').toggle('fast'); $(ev.target).parent().parent().siblings('dd').find('ul').toggle('fast');
}); });
$("a.change-xmpp-status-message").click(function (ev) {
ev.preventDefault();
var form = ''+
'<form id="set-custom-xmpp-status">' +
'<input type="text" class="custom-xmpp-status"I am online"'+
'placeholder="I am online"/>' +
'<button type="submit">Save</button>' +
'</form>';
$(ev.target).closest('.xmpp-status').replaceWith(form);
$(ev.target).closest('.custom-xmpp-status').focus().focus();
});
$('.toggle-xmpp-contact-form').click(function (ev) { $('.toggle-xmpp-contact-form').click(function (ev) {
ev.preventDefault(); ev.preventDefault();
$(ev.target).parent().parent().find('.search-xmpp').toggle('fast', function () { $(ev.target).parent().parent().find('.search-xmpp').toggle('fast', function () {
......
{ {
"name": "converse.js", "name": "converse.js",
"version": "0.5.1", "version": "0.6.2",
"description": "Browser based XMPP instant messaging client", "description": "Browser based XMPP instant messaging client",
"main": "main.js", "main": "main.js",
"directories": { "directories": {
......
<!doctype html public "-//w3c//dtd html 4.01 transitional//en"
"http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<title>converse.js tests for minified files</title>
<meta name="description" content="converse.js: open source browser-based instant messaging" />
<link rel="shortcut icon" type="image/png" href="components/jasmine/images/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="components/jasmine/src/html/jasmine.css">
<link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">
<link rel="stylesheet" type="text/css" media="screen" href="converse.min.css">
<script src="converse.min.js"></script>
<script src="components/jasmine/lib/jasmine-core/jasmine.js"></script>
<script src="components/jasmine/lib/jasmine-core/jasmine-html.js"></script>
<script src="node_modules/jasmine-reporters/src/jasmine.console_reporter.js"></script>
<script src="node_modules/jasmine-reporters/src/jasmine.junit_reporter.js"></script>
</head>
<body>
<div id="header_wrap" class="outer">
<header class="inner">
<h1 id="project_title"><a href="http://conversejs.org">converse.js</a></h1>
<h2 id="project_tagline">tests</h2>
</header>
</div>
<div id="chatpanel">
<div id="collective-xmpp-chat-data"></div>
<div id="toggle-controlbox">
<a href="#" class="chat toggle-online-users">
<span class="conn-feedback">click here to chat</span> <strong style="display: none" id="online-count">(0)</strong>
</a>
</div>
</div>
<script>
var mock_connection = {
'muc': {
'listRooms': function () {},
'join': function () {},
'leave': function () {},
'removeRoom': function () {},
'rooms': {}
},
'jid': 'dummy@localhost',
'addHandler': function (handler, ns, name, type, id, from, options) {
return function () {};
},
'send': function () {},
'roster': {
'add': function () {},
'authorize': function () {},
'unauthorize': function () {},
'get': function () {},
'subscribe': function () {},
'registerCallback': function () {}
},
'vcard': {
'get': function (callback, jid) {
var firstname, lastname;
if (!jid) {
jid = 'dummy@localhost';
firstname = 'Max';
lastname = 'Mustermann';
} else {
var name = jid.split('@')[0].replace('.', ' ').split(' ');
firstname = name[0].charAt(0).toUpperCase()+name[0].slice(1);
lastname = name[1].charAt(0).toUpperCase()+name[1].slice(1);
}
var fullname = firstname+' '+lastname;
var vcard = $iq().c('vCard').c('FN').t(fullname);
callback(vcard.tree());
}
},
'disco': {
'info': function () {},
'items': function () {}
}
};
require([
"jquery",
"converse",
], function($, converse) {
// Set up converse.js
window.localStorage.clear();
converse.initialize({
prebind: false,
xhr_user_search: false,
auto_subscribe: false,
animate: false
});
converse.onConnected(
mock_connection,
function (converse) {
window.converse = converse;
require([
"spec/MainSpec",
"spec/ChatRoomSpec"
], function () {
// Jasmine stuff
var jasmineEnv = jasmine.getEnv();
if (/PhantomJS/.test(navigator.userAgent)) {
jasmineEnv.addReporter(new jasmine.TrivialReporter());
jasmineEnv.addReporter(new jasmine.JUnitXmlReporter('./test-reports/'));
jasmineEnv.addReporter(new jasmine.ConsoleReporter());
jasmineEnv.updateInterval = 0;
} else {
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.addReporter(new jasmine.ConsoleReporter());
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
jasmineEnv.updateInterval = 200;
}
jasmineEnv.execute();
});
}
);
}
);
</script>
</body>
</html>
...@@ -3,10 +3,10 @@ require.config({ ...@@ -3,10 +3,10 @@ require.config({
paths: { paths: {
"jquery": "components/jquery/jquery", "jquery": "components/jquery/jquery",
"locales": "locale/locales", "locales": "locale/locales",
"tinysort": "components/tinysort/src/jquery.tinysort", "jquery.tinysort": "components/tinysort/src/jquery.tinysort",
"underscore": "components/underscore/underscore", "underscore": "components/underscore/underscore",
"backbone": "components/backbone/backbone", "backbone": "components/backbone/backbone",
"localstorage": "components/backbone.localStorage/backbone.localStorage", "backbone.localStorage": "components/backbone.localStorage/backbone.localStorage",
"strophe": "components/strophe/strophe", "strophe": "components/strophe/strophe",
"strophe.muc": "components/strophe.muc/index", "strophe.muc": "components/strophe.muc/index",
"strophe.roster": "components/strophe.roster/index", "strophe.roster": "components/strophe.roster/index",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment