/www/jssrc/blerg/Controls.js
enyo.kind({
    name: "blerg.Controls",
    kind: "Control",
    classes: "blerg-controls",
    username: null,
    postShowing: false,
    published: {
        loggedIn: false
    },
    handlers: {
        onLogin: "login",
        onLogout: "logout",
        onPostVisibility: "postVisibilityUpdate",
        onShowForgotPasswordLink: "showForgotPasswordLink"
    },
    components: [
        {name: "loggedOutControls", components: [
            {tag: "form", onkeyup: "loginKeyUp", classes: "login", components: [
                {kind: "onyx.Groupbox", components: [
                    {kind: "onyx.InputDecorator", components: [
                        {name: "username", kind: "onyx.Input", placeholder: "Username", attributes: {tabindex: 1}}
                    ]},
                    {kind: "onyx.InputDecorator", components: [
                        {name: "password", kind: "onyx.Input", placeholder: "Password", type: "password", attributes: {tabindex: 2}}
                    ]},
                ]},
                {kind: "onyx.Button", content: "Login", onclick: "loginClicked", attributes: {tabindex: 3}},
                {name: "forgotPassword", showing: false, style: "margin-top: 10px; text-align: left", components: [
                    {kind: "blerg.Link", content: "Forgot your password?", onNavigate: "popupForgotPasswordDialog"}
                ]}
            ]}
        ]},
        {name: "loggedInControls", showing: false, components: [
            {name: "greeting", classes: "blerg-controls-greeting", components: [
                {tag: null, content: "Hello, "},
                {name: "userlink", tag: "a"},
                {tag: null, content: ". "},
                {kind: "blerg.Link", content: "Logout", onNavigate: "logoutClicked"},
                {tag: null, content: "."},
                {tag: "br"},
                {kind: "blerg.Link", content: "Account Center", href: '/#/account'},
                {tag: null, content: "."}
            ]},
            {classes: "blerg-controls-toolbar", components: [
                {name: "mentionButton", kind: "onyx.Button", content: "Feed Your Vanity", onclick: "chatterClicked"},
                {name: "feedButton", kind: "onyx.Button", classes: "feed-button", content: "Stalk Your Victims", onclick: "feedClicked"},
                {name: "spewButton", kind: "onyx.Button", classes: "spew-button", content: "Spew It!", onclick: "spewToggle"}
            ]},
        ]},
        {name: "forgotPasswordDialog", kind: "blerg.ForgotPasswordDialog"},
        {name: "api", kind: "blerg.API",
         onStatus: "gotStatus"},
        {kind: "Signals", 
         onClearNotification: "clearNotification"}
    ],
    showRSS: function(url) {
        this.$.rssButton.show();
        if (url)
            this.$.rssButton.setAttribute('href', url);
    },
    hideRSS: function() {
        this.$.rssButton.hide();
    },
    loggedInChanged: function() {
        if (this.loggedIn) {
            this.$.loggedOutControls.hide();
            this.$.loggedInControls.show();
        } else {
            this.$.loggedOutControls.show();
            this.$.loggedInControls.hide();
        }
    },
    loginClicked: function(inSender, inEvent) {
        this.bubble('onTryLogin', {
            username: this.$.username.getValue(),
            password: this.$.password.getValue()
        });
        inEvent.preventDefault();
        return true;
    },
    loginKeyUp: function(inSender, inEvent) {
        if (inEvent.keyCode == 13) {
            if (this.$.username.hasFocus()) {
                this.$.password.focus();
            } else {
                this.loginClicked(this, inEvent);
            }
            return true;
        }
    },
    logoutClicked: function() {
        this.bubble('onTryLogout');
        return true;
    },
    login: function(inSender, inEvent) {
        this.$.password.setValue('');
        this.$.forgotPassword.hide();
        // TODO: Replace with regular blur() call in future enyo
        this.$.password.node.blur();
        this.setLoggedIn(true);
        this.$.userlink.setAttribute('href', '/#' + inEvent.username);
        this.$.userlink.setContent('@' + inEvent.username);
        this.username = inEvent.username;

        this.updateStatus();
        this.feedStatusUpdateInterval = setInterval(function() {
            this.updateStatus();
        }.bind(this), 900000);
    },
    logout: function(inSender, inEvent) {
        this.setLoggedIn(false);
        clearInterval(this.feedStatusUpdateInterval);
    },
    changePasswordClicked: function() {
        this.bubble('onShowChangePassword');
    },
    spewToggle: function(inSender, inEvent) {
        this.postShowing = !this.postShowing;
        this.bubble('onPostVisibility', {showing: this.postShowing});
    },
    postVisibilityUpdate: function(inSender, inEvent) {
        this.postShowing = inEvent.showing;
        this.$.spewButton.addRemoveClass('active', inEvent.showing);
    },
    updateStatus: function() {
        this.$.api.getStatus();
    },
    gotStatus: function(inSender, inEvent) {
        if ('mentioned' in inEvent) {
            this.$.mentionButton.addRemoveClass('new', inEvent.mentioned);
        }
        if ('feed_new' in inEvent) {
            this.$.feedButton.addRemoveClass('new', inEvent.feed_new > 0);
            if (inEvent.feed_new > 0) {
                this.$.feedButton.setContent('Stalk Your Victims (' + inEvent.feed_new + ')');
            } else {
                this.$.feedButton.setContent('Stalk Your Victims');
            }
        }
    },
    chatterClicked: function() {
        window.location.href = '/#/ref/' + this.username;
        this.bubble('onNavigate');
    },
    feedClicked: function() {
        window.location.href = '/#/feed';
        this.bubble('onNavigate');
    },
    clearNotification: function(inSender, inEvent) {
        if (inEvent.type == 'feed') {
            this.gotStatus(this, {feed_new: 0});
        } else if (inEvent.type == 'mentioned') {
            this.gotStatus(this, {mentioned: false});
        }
    },
    showForgotPasswordLink: function(inSender, inevent) {
        this.$.forgotPassword.show();
    },
    popupForgotPasswordDialog: function() {
        this.$.forgotPasswordDialog.setUsername(this.$.username.getValue());
        this.$.forgotPasswordDialog.show();
    }
});