/www/src/ChatClient.js
enyo.kind({
    name: "ChatClient",
    kind: "Control",
    loggedIn: false,
    components: [
        {name: "mainPanels", kind: "Panels", arrangerKind: "CollapsingArranger", style: "height: 100%", components: [
            {name: "picker", kind: "Picker", onConversationSwitched: "conversationSwitched"},
            {name: "conversation", kind: "Conversation", classes: "panel-shadow"},
        ]},
        {name: "loginDialog", kind: "LoginDialog", onTryLogin: "tryLogin"},
        {kind: "Signals",
         onStartLogin: "startLogin",
         onStartLogout: "startLogout",
         onMessageSent: "messageSent"}
    ],
    create: function() {
        this.inherited(arguments);
        this.socketSetup();
    },
    socketSetup: function() {
        this.socket = io.connect(location.protocol + '//' + location.host);

        this.socket.on('login-successful', function(data) {
            enyo.Signals.send('onLoginSuccessful', {
                username: data.username
            });
        }.bind(this));

        this.socket.on('login-failed', function() {
            enyo.Signals.send('onLoginFailed');
        }.bind(this));

        this.socket.on('roster', function(data) {
            this.$.picker.setRoster(data);
        }.bind(this));

        this.socket.on('message', function(data) {
            enyo.Signals.send('onMessageReceived', data);
            conversationStore.appendConversation(data.jid, data);
            this.$.picker.updateConversationList();
        }.bind(this));

        this.socket.on('buddy', function(data) {
            this.$.picker.setPresence(data);
        }.bind(this));

        this.socket.on('disconnect', function() {
            enyo.Signals.send('onLogout');
            console.log('logged out');
        }.bind(this));

        this.socket.on('error', function() {
            socket.disconnect();
            // Retry a bit later
            setTimeout(this.socketSetup.bind(this), 1000);
        }.bind(this));
    },
    startLogin: function(inSender, inEvent) {
        this.$.loginDialog.reset();
        this.$.loginDialog.show();
    },
    startLogout: function(inSender, inEvent) {
        this.socket.emit('logout');
    },
    tryLogin: function(inSender, inEvent) {
        console.log('attempting login');
        this.socket.emit('login', this.$.loginDialog.getData());
    },
    messageSent: function(inSender, inEvent) {
        this.socket.emit('send-message', inEvent);
        conversationStore.appendConversation(inEvent.jid, inEvent);
        this.$.picker.updateConversationList();
    },
    conversationSwitched: function(inSender, inEvent) {
        this.$.conversation.setJid(inEvent.jid);
        this.$.conversation.setName(inEvent.name);
        if (enyo.Panels.isScreenNarrow()) {
            this.$.mainPanels.setIndex(1);
        }
    }
});