﻿(function ($) {

    var options = {
        ajax: false,
        callback: false,
        container: null,
        extraPerms: false
    };

    $.fn.facebookAuthorizeLink = function (opts) {

        $.extend(options, opts);

        return this.each(function () {

            var link = $(this);
            if (!options.ajax) {
                var accessToken = $("<input type='hidden' />");
                accessToken.attr("name", "Facebook.AccessToken");

                var userName = $("<input type='hidden' />");
                userName.attr("name", "Facebook.UserName");

                var displayName = $("<input type='hidden' />");
                displayName.attr("name", "Facebook.DisplayName");

                link.parent().append(displayName)
                             .append(accessToken)
                             .append(userName);
            }

            link.unbind("click").click(function (event) {

                var form = link.parents("form").first();
                var parent = link.parent();

                NSM.Facebook.init();
                event.preventDefault();

                FB.login(function (loginResponse) {
                    if (loginResponse.authResponse) {
                        FB.api('/me', function (apiResponse) {
                            if (options.ajax) {
                                var pagesPrompt = $("<div />");
                                var notYouLink = $("<div />").append("To sign in with a different facebook account, click <a href='javascript:'>here</a>");
                                notYouLink.click(function () {
                                    FB.logout(function () {
                                        pagesPrompt.dialog('close').remove().unblock();
                                        alert("You have been logged out of Facebook.\nClick the Facebook link to reconnect.");
                                        link.unblock();
                                    });
                                })
                                pagesPrompt.dialog({
                                    title: 'Select the profile/pages you\'d like to add:',
                                    modal: true,
                                    dialogClass: 'ui-dialog-custom',
                                    closeText: '',
                                    width: 315
                                });
                                NSM.blockWhileLoading(pagesPrompt);
                                pagesPrompt.load(
                                    link.attr("href"),
                                    {
                                        FacebookUserId: loginResponse.authResponse.userID,
                                        FacebookDisplayName: apiResponse.name,
                                        AccessToken: loginResponse.authResponse.accessToken
                                    },
                                    function (responseText, textStatus, request) {
                                        pagesPrompt.append(notYouLink);
                                        pagesPrompt.find(".closeButton").click(function () {
                                            link.unblock();
                                            pagesPrompt.dialog('close').remove().unblock();
                                        });
                                        $(pagesPrompt).find("form").complexForm({
                                            success: function (result) {
                                                options.container.html(result);
                                                pagesPrompt.dialog('close').remove().unblock();
                                                if ($.isFunction(options.callback)) {
                                                    options.callback({
                                                        apiResponse: apiResponse,
                                                        loginResponse: loginResponse
                                                    });
                                                }
                                                NSM.init();
                                            }
                                        });
                                    });
                            } else {
                                userName.val(loginResponse.authResponse.userID);
                                accessToken.val(loginResponse.authResponse.accessToken);
                                displayName.val(apiResponse.name);
                                if (options.callback === false) {
                                    NSM.SocialMediaAuthorizer.blockAccountAdded(link);
                                } else {
                                    options.callback({
                                        apiResponse: apiResponse,
                                        loginResponse: loginResponse,
                                        link: link
                                    });
                                }
                            }
                        });
                    }
                    else {
                        alert("We use these permissions to summarize your Facebook activity and email them to you. Click Connect again and Allow.");
                        link.unblock();
                    }
                }, { scope : NSM.FacebookPermissions + (options.extraPerms ? ',' + options.extraPerms : '') });

                NSM.blockWhileLoading(link);
            });
        });
    };

})(jQuery);
