/*
Facebook jQuery extensions
*/

var FbTemplates = {
    "deciderJoined": 82771713779,
    "deciderLinked": 82771273779,
    "deciderRated": 82770428779
};


function handle_options(args, defaults) {
    if (args === undefined) {
        var args = {};
    }
    if (defaults === undefined) {
        var defaults = {};
    }
    return jQuery.extend(defaults, args);
}


// (function () {


jQuery.extend({
    // this doesn't seem to actually work, no matter what I try, and won't show
    // up on friends' home pages due to changes Facebook has made in
    // preparation for the Stream API
    fbPublishDirect: function (template_id, options) {
        options = handle_options(options, {
            data: {},
            targets: [],
            body: '',
            size: FB.FeedStorySize.oneLine,
            message: '',
            sequencer: function () {}
        });
        FB.ensureInit(function () {
            var result = FB.Facebook.apiClient.feed_publishUserAction(
                template_id,
                options.data,
                options.targets,
                options.body,
                options.size,
                options.message,
                options.sequencer
            );
        });
    },
    // this unfortunately pops up a dialog, but actually seems to work; it's
    // unclear if this publishes to friends' home pages as well as the user's
    // wall
    fbPublishDialog: function (template_id, options) {
        options = handle_options(options, {
            data: {},
            targets: [],
            body: '',
            message: '',
            sequencer: function () {}
        });
        FB.ensureInit(function () {
            FB.Connect.showFeedDialog(
                template_id,
                options.data,
                options.targets,
                options.body,
                null,
                FB.RequireConnect.require,
                options.sequencer
            );
        });
    },
    fbPublishStream: function(options) {
        options = handle_options(options, {
            user_message: null,
            attachment: null,
            action_links: null,
            target_id: null,
            user_message_prompt: null,
            callback: null,
            auto_publish: null
        });
        // only try to prompt to publish a comment if this is a connected
        // account, we don't like angry emails
        jQuery.fbIfConnected(function() {
            jQuery.fbWithPermission(
                "publish_stream",
                function() {
                    FB.Connect.streamPublish(
                        options.user_message,
                        options.attachment,
                        options.action_links,
                        options.target_id,
                        options.user_message_prompt,
                        options.callback,
                        options.auto_publish
                    );
                }
            );
        });
    },
    fbConnectSession: function (callback) {
        FB.ensureInit(function () {
            FB.Connect.requireSession(function () {
                callback();
            });
        });
    },
    fbConnectLogin: function (login_url, callback) {
        jQuery.fbConnectSession(function () {
            if (callback) {
                callback();
            }
            window.location = login_url;
        });
    },
    fbConnectLogout: function (options) {
        options = handle_options(options, {
            logout_url: null,
            callback: null
        });
        FB.ensureInit(function () {
            FB.Connect.logout(function () {
                if (options.callback) {
                    options.callback();
                }
                if (options.logout_url) {
                    window.location = options.logout_url;
                }
            });
        });
    },
    fbDomUpdate: function (callback) {
        FB.ensureInit(function () {
            if (callback) {
                callback();
            }
            FB.XFBML.Host.parseDomTree();
        });
    },
    fbIfConnected: function (tCallback, fCallback) {
        FB.ensureInit(function () {
            FB.Connect.ifUserConnected(tCallback, fCallback);
        });
    },
    fbWithPermission: function (permission, success, failure) {
        FB.ensureInit(function () {
            FB.Facebook.apiClient.users_hasAppPermission(
                permission,
                function (result) {
                    if (result) {
                        if (success) {
                            success();
                        }
                    } else {
                        FB.Connect.showPermissionDialog(
                            permission,
                            function (req_result) {
                                if (req_result === null) {
                                    if (failure) {
                                        failure();
                                    }
                                } else {
                                    if (success) {
                                        success();
                                    }
                                }
                            }
                        );
                    }
                }
            );
        });
    }
});

jQuery.fn.extend({
    fbReplaceWith: function (content) {
        var jq = this;
        jQuery.fbDomUpdate(function () {
            jq.replaceWith(content);
        });
        return this;
    }
});

// })();
