code: function (elem)
      {
          if (elem.getAttribute("type") == "error") {
              Strophe.info("SASL binding failed.");
              var conflict = elem.getElementsByTagName("conflict"), condition;
              if (conflict.length > 0) {
                  condition = 'conflict';
              }
              this._changeConnectStatus(Strophe.Status.AUTHFAIL, condition);
              return false;
          }
  
          // TODO - need to grab errors
          var bind = elem.getElementsByTagName("bind");
          var jidNode;
          if (bind.length > 0) {
              // Grab jid
              jidNode = bind[0].getElementsByTagName("jid");
              if (jidNode.length > 0) {
                  this.jid = Strophe.getText(jidNode[0]);
  
                  if (this.do_session) {
                      this._addSysHandler(this._sasl_session_cb.bind(this),
                                          null, null, null, "_session_auth_2");
  
                      this.send($iq({type: "set", id: "_session_auth_2"})
                                    .c('session', {xmlns: Strophe.NS.SESSION})
                                    .tree());
                  } else {
                      this.authenticated = true;
                      this._changeConnectStatus(Strophe.Status.CONNECTED, null);
                  }
              }
          } else {
              Strophe.info("SASL binding failed.");
              this._changeConnectStatus(Strophe.Status.AUTHFAIL, null);
              return false;
          }
      }
docs: PrivateFunction: _sasl_bind_cb
  _Private_ handler for binding result and session start.
  
  Parameters:
  (XMLElement) elem - The matching stanza.
  
  Returns:
  false to remove the handler.