/www/src/Picker.js
enyo.kind({
    name: "Picker",
    kind: "FittableRows",
    classes: "picker",
    events: {
        onConversationSwitched: ''
    },
    conversations: [],
    buddies: [],
    buddiesByJid: {},
    roster: {},
    components: [
        {name: "tabButtons", kind: "onyx.RadioGroup", classes: "picker-radiobuttons", components: [
            {content: "Conversations", active: true, ontap: "selectConversations"},
            {content: "Buddies", ontap: "selectBuddies"}
        ]},
        {name: "tabPanels", kind: "Panels", classes: "picker-panels", fit: true, draggable: false, components: [
            {name: "conversationList", kind: "List", onSetupItem: "conversationItemSetup", components: [
                {classes: "conversation-list-item", onclick: "conversationItemClick", components: [
                    {classes: "conversation-status", components: [
                        {name: "conversationBuddyStatus", kind: "StatusCircle"},
                    ]},
                    {classes: "conversation-content", components: [
                        {name: "conversationBuddyName", classes: "conversation-buddy-name"},
                        {name: "conversationLastMessage", classes: "conversation-last-message"},
                    ]},
                    {classes: "conversation-image-container", components: [
                        {name: "conversationImage", classes: "buddy-image"},
                    ]}
                ]}
            ]},
            {name: "buddyList", kind: "List", onSetupItem: "buddyItemSetup", components: [
                {classes: "buddy-list-item", onclick: "buddyItemClick", components: [
                    {classes: "buddy-status", components: [
                        {name: "buddyStatus", kind: "StatusCircle"},
                    ]},
                    {classes: "buddy-content", components: [
                        {name: "buddyName", classes: "buddy-name"},
                        {name: "buddyStatusText", classes: "buddy-status-text"},
                    ]},
                    {classes: "buddy-image-container", components: [
                        {name: "buddyImage", classes: "buddy-image"},
                    ]}
                ]}
            ]}
        ]},
        {kind: "onyx.Toolbar", components: [
            {name: "loginButton", kind: "onyx.Button", content: "Login", onclick: "loginClick"},
            {name: "logoutButton", kind: "onyx.Button", content: "Logout", showing: false, onclick: "logoutClick"},
        ]},
        {kind: "Signals", onLoginSuccessful: "didLogin", onLogout: "didLogout"}
    ],
    create: function() {
        this.inherited(arguments);
        conversationStore.loadConversations();
        this.updateConversationList();
    },
    selectConversations: function(inSender, inEvent) {
        this.$.tabPanels.setIndex(0);
    },
    updateConversationList: function() {
        this.conversations = conversationStore.getConversationSummary();
        this.$.conversationList.setCount(this.conversations.length);
        this.$.conversationList.refresh();
    },
    selectBuddies: function(inSender, inEvent) {
        this.$.tabPanels.setIndex(1);
    },
    setRoster: function(data) {
        this.roster = data;
        for (jid in data) {
            this.mergeBuddyInfo(data[jid]);
        }
        this.updateBuddyList();
    },
    setPresence: function(data) {
        this.mergeBuddyInfo(data);
        this.updateBuddyList();
    },
    mergeBuddyInfo: function(data) {
        var b = this.buddiesByJid[data.jid];
        if (!b) {
            b = this.buddiesByJid[data.jid] = {};
            this.buddies.push(b);
        }
        for (i in data) {
            b[i] = data[i];
        }
        if (!b.name) {
            b.name = b.jid;
        }
        b.lastUpdate = new Date().getTime();
    },
    sortBuddies: function() {
        this.buddies.sort(function(a, b) {
            if (a.lastUpdate > b.lastUpdate)
                return -1;
            if (a.lastUpdate < b.lastUpdate)
                return 1;
            return 0;
        });
    },
    updateBuddyList: function() {
        this.sortBuddies();
        this.$.buddyList.setCount(this.buddies.length);
        this.$.buddyList.refresh();
        this.$.conversationList.refresh();
    },
    conversationItemSetup: function(inSender, inEvent) {
        var row = this.conversations[inEvent.index];
        if (!row) return;
        var status;
        if (this.buddiesByJid[row.jid]) {
            status = this.buddiesByJid[row.jid].status;
        } else {
            status = 'unknown';
        }
        this.$.conversationBuddyStatus.setStatus(status);
        var name = row.jid;
        if (row.jid in this.roster && this.roster[row.jid].name) {
            name = this.roster[row.jid].name;
        }
        this.$.conversationBuddyName.setContent(name);
        this.$.conversationLastMessage.setContent(row.message);
    },
    buddyItemSetup: function(inSender, inEvent) {
        var row = this.buddies[inEvent.index];
        if (!row) return;
        this.$.buddyStatus.setStatus(row.status);
        this.$.buddyName.setContent(row.name);
        this.$.buddyStatusText.setContent(row.statusText);
    },
    loginClick: function(inSender, inEvent) {
        enyo.Signals.send('onStartLogin');
    },
    logoutClick: function(inSender, inEvent) {
        enyo.Signals.send('onStartLogout');
    },
    didLogin: function(inSender, inEvent) {
        this.$.loginButton.hide();
        this.$.logoutButton.show();
    },
    didLogout: function(inSender, inEvent) {
        this.$.logoutButton.hide();
        this.$.loginButton.show();
        this.buddies = [];
        this.buddiesByJid = {};
        this.updateBuddyList();
    },
    conversationItemClick: function(inSender, inEvent) {
        this.doConversationSwitched({
            jid: this.conversations[inEvent.index].jid,
            name: this.conversations[inEvent.index].jid
        });
    },
    buddyItemClick: function(inSender, inEvent) {
        this.doConversationSwitched({
            jid: this.buddies[inEvent.index].jid,
            name: this.buddies[inEvent.index].name
        });
    }
});