/www/jssrc/blerg/User.js
enyo.kind({
    name: "blerg.User",
    kind: "blerg.Pager",
    listKind: "blerg.Record",
    handlers: {
        onLogin: "getStalkStatus",
        onLogout: "getStalkStatus",
        onReload: "usernameChanged"
    },
    published: {
        username: "",
        permalink: false,
        record: null,
    },
    components: [
        {classes: "blerg-user-controls", components: [
            {name: "chatterLink", kind: "blerg.Link", content: "[chatter]"},
            {name: "stalkLink", kind: "blerg.Link", content: "[stalk]", showing: false, onNavigate: "startStalking"},
            {name: "unstalkLink", kind: "blerg.Link", content: "[stop stalking]", showing: false, onNavigate: "stopStalking"},
            {name: "rssLink", kind: "blerg.Link", components: [
                {tag: null, content: "["},
                {kind: "Image", src: "/images/rss.png", attributes: {width: 16, height: 16}},
                {tag: null, content: "RSS]"}
            ]}
        ]},
        {name: "records"},
        {name: "spinner", kind: "OldSchoolSpinner", showing: false},
        {name: "emptyAccountMessage", showing: false, content: "Hey, there's nothing here!"},
        {name: "userNotFoundMessage", classes: "blerg-error", showing: false, content: "User not found"},
        {name: "loadMoreButton", kind: "onyx.Button", onclick: "loadMore", content: "Load More"},
        {name: "api", kind: "blerg.API",
         onItemsLoaded: "itemsLoaded",
         onUserNotFound: "userNotFound",
         onAPIError: "apiError",
         onSubscriptionStatus: "gotStalkStatus"}
    ],
    statics: {
        locationDetect: function(l) {
            var m = l.hash.match(/^#([A-Za-z0-9_-]+)(?:\/(\d+))?$/);
            if (m) {
                return {
                    kind: "blerg.User",
                    username: m[1],
                    permalink: m[2] != undefined,
                    record: parseInt(m[2])
                };
            }
        }
    },
    create: function() {
        this.inherited(arguments);
        this.usernameChanged();
    },
    usernameChanged: function() {
        this.bubble('onSetTitle', {section: '@' + this.username});
        this.$.records.destroyComponents();
        this.lastRecord = null;
        this.$.loadMoreButton.hide();
        this.$.chatterLink.setHref('/#/ref/' + this.username);
        this.$.rssLink.setHref('/rss/' + this.username);
        this.getStalkStatus();

        if (this.permalink) {
            this.loadItems(this.record, this.record);
        } else {
            this.loadMore();
        }
    },
    loadItems: function(from, to) {
        this.inherited(arguments);
        this.$.loadMoreButton.hide();
        this.$.api.loadUserRecords(this.username, from, to);
    },
    itemsLoaded: function(inSender, inEvent) {
        this.$.userNotFoundMessage.hide();
        if (this.permalink) {
            this.$.loadMoreButton.hide();
        } else {
            this.$.loadMoreButton.show();
        }

        for (var i = 0; i < inEvent.entries.length; i++) {
            inEvent.entries[i].author = this.username;
        }

        this.addItems(inEvent.entries);
        if (this.lastRecord == 0 || inEvent.entries.length == 0)
            this.$.loadMoreButton.hide();
    },
    addItems: function(items) {
        this.$.emptyAccountMessage.setShowing(items.length == 0);
        this.inherited(arguments);
    },
    userNotFound: function() {
        this.addItems([]);
        this.$.emptyAccountMessage.hide();
        this.$.userNotFoundMessage.show();
    },
    apiError: function() {
        this.addItems([]);
        alert('Unknown API Error');
    },
    getStalkStatus: function() {
        if (!blerg.API.loggedIn) {
            this.$.stalkLink.hide();
            this.$.unstalkLink.hide();
            return;
        }
        this.$.api.getSubscriptionStatus(this.username);
    },
    gotStalkStatus: function(inSender, inEvent) {
        if (inEvent.subscribed) {
            this.$.stalkLink.hide();
            this.$.unstalkLink.show();
        } else {
            this.$.stalkLink.show();
            this.$.unstalkLink.hide();
        }
    },
    startStalking: function() {
        this.$.api.subscribe(this.username);
    },
    stopStalking: function() {
        this.$.api.unsubscribe(this.username);
    }
});