diff --git a/converse.js b/converse.js
index 65c003c03..be8c7e016 100644
--- a/converse.js
+++ b/converse.js
@@ -1897,6 +1897,11 @@
}
},
+ giveFeedback: function (message, klass) {
+ // TODO:
+ alert(message);
+ },
+
onConnected: function () {
if (this.model.get('connected')) {
this.render().initRoster();
@@ -1951,13 +1956,21 @@
var cfg = {'$parent': this.$el.find('.controlbox-panes'), 'model': this};
if (!this.loginpanel) {
this.loginpanel = new converse.LoginPanel(cfg);
- this.registerpanel = new converse.RegisterPanel(cfg);
+ if (converse.allow_registration) {
+ this.registerpanel = new converse.RegisterPanel(cfg);
+ }
} else {
this.loginpanel.delegateEvents().initialize(cfg);
+ if (converse.allow_registration) {
+ this.registerpanel.delegateEvents().initialize(cfg);
+ }
}
this.loginpanel.render();
- this.registerpanel.render().$el.hide();
+ if (converse.allow_registration) {
+ this.registerpanel.render().$el.hide();
+ }
this.initDragResize();
+ return this;
},
renderContactsPanel: function () {
@@ -2040,7 +2053,7 @@
},
switchTab: function (ev) {
- ev.preventDefault();
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
var $tab = $(ev.target),
$sibling = $tab.parent().siblings('li').children('a'),
$tab_panel = $($tab.attr('href'));
@@ -2048,6 +2061,7 @@
$sibling.removeClass('current');
$tab.addClass('current');
$tab_panel.show();
+ return this;
},
showHelpMessages: function (msgs) {
@@ -4447,6 +4461,7 @@
},
initialize: function (cfg) {
+ this.fields = {};
this.$parent = cfg.$parent;
this.$tabs = cfg.$parent.parent().find('#controlbox-tabs');
},
@@ -4471,29 +4486,24 @@
errors = false;
if (!domain) { errors = true; $domain_input.addClass('error'); }
if (errors) { return; } // TODO provide error messages
- this.connect($form, domain);
+ $form.find('input[type=submit]').hide().after('');
+ converse.connection.register.connect(domain, $.proxy(this.onRegistering, this));
+ this.domain = domain;
return false;
},
- connect: function ($form, domain) {
- if ($form) {
- $form.find('input[type=submit]').hide().after('');
- }
- converse.connection.register.connect(domain, $.proxy(this.onRegistering, this));
- },
-
giveFeedback: function (message, klass) {
- $('.conn-feedback').attr('class', 'conn-feedback').text(message);
+ // TODO: need to add feedback element...
+ this.$('.conn-feedback').attr('class', 'conn-feedback').text(message);
if (klass) {
$('.conn-feedback').addClass(klass);
}
},
onRegistering: function (status, error) {
+ var that;
console.log('onRegistering');
- if (status === Strophe.Status.CONNECTING) {
- converse.giveFeedback(__('Connecting'));
- } else if (status === Strophe.Status.CONNFAIL) {
+ if (status === Strophe.Status.CONNFAIL) {
converse.renderLoginPanel();
this.giveFeedback(__('Connection Failed'), 'error');
} else if (status === Strophe.Status.DISCONNECTING) {
@@ -4513,6 +4523,29 @@
} else if (status == Strophe.Status.NOTACCEPTABLE) {
// TODO
converse.log('NOTACCEPTABLE');
+ } else if (status == Strophe.Status.REGISTERED) {
+ converse.log("Registered successfully.");
+ that = this;
+ converse.connection.reset();
+ this.$('form').hide(function () {
+ $(this).replaceWith('');
+ if (that.fields.password && that.fields.username) {
+ // automatically log the user in
+ converse.connection.connect(
+ that.fields.username+'@'+that.domain,
+ that.fields.password,
+ converse.onConnect
+ );
+ converse.chatboxviews.get('controlbox')
+ .switchTab({target: that.$tabs.find('.current')})
+ .giveFeedback(__('Now logging you in'));
+ } else {
+ converse.chatboxviews.get('controlbox')
+ .renderLoginPanel()
+ .giveFeedback(__('Registered successfully'));
+ }
+ that.reset();
+ });
}
},
@@ -4528,11 +4561,18 @@
});
$form.append('');
$form.append('');
- $form.on('submit', $.proxy(this.register, this));
- $form.find('input[type=button]').on('click', $.proxy(this.cancel, this));
+ $form.on('submit', $.proxy(this.onRegister, this));
+ $form.find('input[type=button]').on('click', $.proxy(this.onCancel, this));
},
reportErrors: function (stanza) {
+ /* Report back to the user any error messages received from the
+ * XMPP server after attempted registration.
+ *
+ * Parameters:
+ * (XMLElement) stanza - The IQ stanza received from the
+ * XMPP server.
+ */
var $form= this.$('form'), flash;
var $errmsgs = $(stanza).find('error text');
var $flash = $form.find('.form-errors');
@@ -4559,11 +4599,22 @@
},
cancel: function (ev) {
+ /* Callback method, when the user cancels the registration
+ * form.
+ */
if (ev && ev.preventDefault) { ev.preventDefault(); }
- alert('TBD'); // TODO
+ this.render(); // XXX: check if this works.
},
- register: function (ev) {
+ onRegister: function (ev) {
+ /* Callback method, when the user submits the registration
+ * form.
+ * Provides form error feedback or starts the registration
+ * process.
+ *
+ * Parameters:
+ * (Event) ev - the submit event.
+ */
if (ev && ev.preventDefault) { ev.preventDefault(); }
var $empty_inputs = this.$('input:emptyVal');
if ($empty_inputs.length) {
@@ -4578,13 +4629,39 @@
$inputs.each(function () {
iq.cnode(utils.webForm2xForm(this)).up();
});
- converse.connection._addSysHandler(this._submit_cb.bind(this),
- null, "iq", null, null);
+ converse.connection._addSysHandler(this._onRegisterIQ.bind(this), null, "iq", null, null);
converse.connection.send(iq);
+ this.setFields(iq.tree());
},
- _submit_cb: function (stanza) {
- var i, field, error = null,
+ setFields: function (stanza) {
+ /* Stores the values that will be sent to the XMPP server
+ * during attempted registration.
+ *
+ * Parameters:
+ * (XMLElement) stanza - the IQ stanza that will be sent to the XMPP server.
+ */
+ var query = stanza.getElementsByTagName("query"), field, i;
+ if (query.length > 0) {
+ query = query[0];
+ $(query).find('field').each($.proxy(function (idx, field) {
+ var name = field.getAttribute('var').toLowerCase();
+ var value = $(field).children('value').text();
+ this.fields[name] = value;
+ converse.connection.register.fields[name] = value;
+ }, this));
+ }
+ },
+
+ _onRegisterIQ: function (stanza) {
+ /* Callback method that gets called when a return IQ stanza
+ * is received from the XMPP server, after attempting to
+ * register a new user.
+ *
+ * Parameters:
+ * (XMLElement) stanza - The IQ stanza.
+ */
+ var i, field, error = null, that,
query = stanza.getElementsByTagName("query");
if (query.length > 0) {
query = query[0];
@@ -4606,15 +4683,16 @@
}
this.reportErrors(stanza);
} else {
- converse.log("Registered successfully.");
- this.$('form').hide(function () {
- $(this).remove(); // TODO What to render next?
- });
converse.connection._changeConnectStatus(Strophe.Status.REGISTERED, null);
}
return false;
},
+ reset: function () {
+ this.fields = {};
+ delete this.domain;
+ },
+
remove: function () {
// XXX ?
this.$tabs.empty();