/www/jssrc/blerg/API.js
var baseURL = '';

// The API state is static so that any instance can use login-dependent API
// calls
enyo.kind({
    name: "blerg.API",
    kind: "Component",
    statics: {
        apiInitialized: false,
        loggedIn: false,
        username: "",
    },
    create: function() {
        this.inherited(arguments);
        if (blerg.API.apiInitialized) {
            if (blerg.API.loggedIn) {
                setTimeout(function() {
                    this.bubble('onLoginSuccessful', {username: blerg.API.username});
                }.bind(this), 0);
            }
            return;
        }

        if (enyo.getCookie('auth')) {
            blerg.API.loggedIn = true;
            blerg.API.username = enyo.getCookie('auth').split('/')[0];
            // Defer the signal until everything's initialized
            setTimeout(function() {
                this.bubble('onLoginSuccessful', {username: blerg.API.username});
            }.bind(this), 0);
        }

        blerg.API.apiInitialized = true;
    },
    signup: function(username, password) {
        var req = new enyo.Ajax({
            url: baseURL + '/create',
            method: 'POST',
            postBody: {
                username: username,
                password: password,
            }
        });
        req.response(this, function(inSender, inResponse) {
            if (inResponse.status == 'success') {
                this.bubble('onSignupSuccess', {username: username});
            } else {
                this.bubble('onSignupFailure', {username: username});
            }
        });
        req.error(this, function() {
            this.bubble('onSignupFailure', {username: username});
        });
        req.go();
    },
    login: function(username, password) {
        var req = new enyo.Ajax({
            url: baseURL + '/login',
            method: 'POST',
            postBody: {
                username: username,
                password: password
            }
        });
        req.response(this, function(inSender, inResponse) {
            if (inResponse.status == 'success') {
                blerg.API.loggedIn = true;
                blerg.API.username = username;
                this.bubble('onLoginSuccessful', {username: username});
            } else {
                this.bubble('onLoginFailed');
            }
        });
        req.error(this, function() {
            this.bubble('onLoginFailed');
        });
        req.go();
    },
    expireClientAuthentication: function() {
        blerg.API.loggedIn = false;
        blerg.API.username = '';
        enyo.setCookie('auth', '', {"Max-Age": 0});
    },
    logout: function() {
        var req = new enyo.Ajax({
            url: baseURL + '/logout',
            method: 'POST'
        });
        var logout_func = function() {
            this.expireClientAuthentication();
            this.bubble('onLogoutSuccessful');
        }.bind(this);
        req.response(this, logout_func);
        req.error(this, logout_func);
        req.go();
    },
    authenticationFailed: function() {
        enyo.log("Authentication failed -- logging out");
        this.expireClientAuthentication();
        this.bubble('onAuthFailure');
    },
    changePassword: function(oldpassword, newpassword) {
        var req = new enyo.Ajax({
            url: baseURL + '/passwd',
            method: 'POST',
            postBody: {
                password: oldpassword,
                new_password: newpassword
            }
        });
        req.response(this, function(inSender, inResponse) {
            if (inResponse.status == 'success') {
                this.bubble('onPasswordChangeSuccessful');
            } else {
                this.bubble('onPasswordChangeFailed');
            }
        });
        req.error(this, function() {
            this.bubble('onPasswordChangeFailed');
        });
        req.go();
    },
    loadUserRecords: function(username, from ,to) {
        var url;
        if (from != undefined && to != undefined) {
            url = baseURL +  '/get/' + username + '/' + from + '-' + to;
        } else {
            url = baseURL +  '/get/' + username;
        }

        var req = new enyo.Ajax({
            url: url
        });
        req.response(this, function(inSender, inResponse) {
            this.bubble('onItemsLoaded', {
                type: 'user',
                username: username,
                from: from,
                to: to,
                entries: inResponse
            });
        });
        req.error(this, function(inSender, inResponse) {
            if (inResponse == 404)
                this.bubble('onUserNotFound');
            else
                this.bubble('onAPIError', {response: inResponse});
        });
        req.go();
    },
    loadTagRecords: function(type, tag) {
        var url;
        switch(type) {
            case 'tag':
                // Apache eats the hash, even encoded.  Probably a security
                // feature.
                url = baseURL + '/tag/H' + tag;
                break;
            case 'ref':
                url = baseURL + '/tag/%40' + tag;
                break;
            default:
                throw new Error("Invalid tag type: " + type);
                return;
        }
        var req = new enyo.Ajax({
            url: url
        });
        req.response(this, function(inSender, inResponse) {
            this.bubble('onItemsLoaded', {
                type: 'tag',
                tagType: type,
                tag: tag,
                entries: inResponse
            });
        });
        req.error(this, function() {
            this.bubble('onItemsLoaded', {
                type: 'tag',
                tagType: type,
                tag: tag,
                entries: []
            });
        });
        req.go();
    },
    getStatus: function() {
        if (!blerg.API.loggedIn)
            throw new Error('Cannot request feed status when not logged in');

        var req = new enyo.Ajax({
            url: baseURL + '/status'
        });
        req.response(this, function(inSender, inResponse) {
            this.bubble('onStatus', inResponse);
        });
        req.error(this, function() {
            if (req.xhrResponse.status == 403) {
                this.authenticationFailed();
            }
        });
        req.go();
    },
    clearStatus: function(type) {
        if (!blerg.API.loggedIn)
            throw new Error('Cannot request feed status when not logged in');

        if (!(type == 'feed' || type == 'mentioned'))
            throw new Error('Invalid status clear type: ' + type);

        var req = new enyo.Ajax({
            url: baseURL + '/status',
            method: 'POST',
            postBody: {
                clear: type
            }
        });
        req.response(this, function(inSender, inResponse) {
            inResponse.type = type;
            this.bubble('onClearStatus', inResponse);
        });
        req.error(this, function() {
            if (req.xhrResponse.status == 403) {
                this.authenticationFailed();
            }
        });
        req.go();
    },
    loadFeed: function() {
        if (!blerg.API.loggedIn)
            throw new Error('Cannot request feed status when not logged in');

        var req = new enyo.Ajax({
            url: baseURL + '/feed'
        });
        req.response(this, function(inSender, inResponse) {
            this.bubble('onItemsLoaded', {
                type: "feed",
                entries: inResponse
            });
        });
        req.error(this, function() {
            if (req.xhrResponse.status == 403) {
                this.authenticationFailed();
            }
        });
        req.go();
    },
    getSubscriptionStatus: function(username) {
        var req = new enyo.Ajax({
            url: baseURL + '/status/' + username
        });
        req.response(this, function(inSender, inResponse) {
            this.bubble('onSubscriptionStatus', {
                username: username,
                subscribed: inResponse.subscribed
            });
        });
        req.error(this, function() {
            if (req.xhrResponse.status == 403) {
                this.authenticationFailed();
            }
        });
        req.go();
    },
    subscription: function(username, v) {
        var subv = v ? true : false;
        var req = new enyo.Ajax({
            url: baseURL + '/subscribe/' + username,
            method: 'POST',
            postBody: {
                subscribed: subv
            }
        });
        req.response(this, function(inSender, inResponse) {
            this.bubble('onSubscriptionStatus', {
                username: username,
                subscribed: inResponse.status == "success" && subv
            });
        });
        req.error(this, function() {
            if (req.xhrResponse.status == 403) {
                this.authenticationFailed();
            }
        });
        req.go();
    },
    subscribe: function(username) {
        this.subscription(username, true);
    },
    unsubscribe: function(username) {
        this.subscription(username, false);
    },
    post: function(data) {
        var req = new enyo.Ajax({
            url: baseURL + '/put',
            method: 'POST',
            postBody: {
                data: data
            }
        });
        req.response(this, function(inSender, inResponse) {
            if (inResponse && inResponse.status == 'success') {
                this.bubble('onPostSuccessful', {
                    username: blerg.API.username,
                    data: data
                });
            } else {
                this.bubble('onPostFailed', {
                    username: blerg.API.username,
                    data: data
                });
            }
        });
        req.error(this, function() {
            if (req.xhrResponse.status == 403) {
                this.authenticationFailed();
            }
        });
        req.go();
    }
});