﻿var Storm = Storm || {};

Storm.Facebook = (function () {

    var APP_ID = null;
    var REQUIRED_PERMISSIONS = null;

    function checkPermissions(requiredPermissions, permissionsGiven) {
        var permissions = requiredPermissions.split(',');
        for (var i = 0; i < permissions.length; i++) {
            if (permissionsGiven.indexOf(permissions[i].trim()) === -1) {
                return false;
            }
        }
        return true;
    }

    function extendFacebookApi() {
        FB.provide("UIServer.Methods", {
            'permissions.request': {
                size: { width: 575, height: 300 },
                url: 'connect/uiserver.php',
                transform: FB.UIServer.genericTransform
            }
        });
    }

    return {
        setup: function (appId, requiredPermissions, url) {
            if (!window.FB) {
                alert('Facebook is not loaded!');
                return;
            }

            APP_ID = appId;
            REQUIRED_PERMISSIONS = requiredPermissions;

            FB.init({ appId: APP_ID,
                status: true,
                cookie: true,
                xfbml: true,
                oauth: true,
                channelUrl: url
            });
            
            extendFacebookApi();
        },

        login: function (redirectUrl) {
            FB.login(function (response) {
                if (response.authResponse) {
                    window.location.href = redirectUrl;
                } else {

                }
            }, { scope: REQUIRED_PERMISSIONS });
        },

        logout: function (redirectUrl, successCallback, errorCallback) {
            if (!jQuery.isFunction(successCallback)) {
                successCallback = function () { return true; };
            }
            if (!jQuery.isFunction(errorCallback)) {
                errorCallback = jQuery.noop;
            }

            FB.getLoginStatus(function (response) {
                if (response.authResponse) {
                    FB.logout(function (res) {
                        if (!res) {
                            errorCallback(res);
                            window.location.href = redirectUrl + "?facebooklogout=true";
                        }
                        if (successCallback(res))
                            window.location.href = redirectUrl + "?facebooklogout=true";
                    });
                } else {
                    successCallback(response);
                    window.location.href = redirectUrl + '?facebookLogout=true';
                }
            });

        },

        requestPermissions: function (permissions, successCallback, errorCallback) {
            if (!jQuery.isFunction(successCallback)) {
                successCallback = function () { return true; };
            }
            if (!jQuery.isFunction(errorCallback)) {
                errorCallback = jQuery.noop;
            }
            FB.ui({
                method: 'permissions.request',
                perms: permissions
            }, function (response) {
                if (!response.session) {
                    errorCallback(response);
                    return;
                }
                var perms = response.perms;
                if (!perms || !checkPermissions(permissions, perms)) {
                    errorCallback(response);
                    return;
                }
                successCallback(response);
            });
        }
    };
})();
