﻿var requestedPerms = 'publish_stream,offline_access,email,user_birthday';
var facebook_userId = -1;

$(document).ready(function() {
    DQFacebook.init();
});


DQFacebook = {
    init: function() {
        FB.init({
            apiKey: '750d936c680a42382156a265bd199d91',
            status: true,
            cookie: true,
            xfbml: true
        });

        FB.getLoginStatus(function(r) {
            if (r.session) {
                switch (r.status) {
                    case "connected":
                        facebook_userId = r.session.uid;
                        //if user has logged in
                        if (!facebook_logged_in && facebook_userId > 0) {
                            server_callback("login:" + facebook_userId);
                        }
                        //get permissions
                        DQFacebook.get_granted_permissions(function() {
                        });
                        break;
                    default:
                        if (facebook_logged_in) {
                            DQFacebook.logout();
                        }
                }
                //sync both accounts
                if (!synced_account && adq_logged_in) {
                    server_callback("sync:" + facebook_userId);
                }
            }
            else {
                // update to state we are no longer logged in
                if (facebook_logged_in) {
                    facebook_logged_in = false;
                    //logout
                    DQFacebook.logout();
                }
            }
        });

        $(".fb-login").click(function(e) {
            e.preventDefault();
            DQFacebook.login();
        });

        $(".fb-logout").click(function(e) {
            DQFacebook.logout();
        });

        DQFacebook.declareEvents();
    },
    login: function(callback) {
        FB.login(function(r) {
            if (r.session) {
                //user logged in
                facebook_logged_in = true;
                switch (r.status) {
                    case "connected":
                        facebook_userId = r.session.uid;
                        //get permissions for user
                        DQFacebook.get_granted_permissions(function() {
                            server_callback("login:" + facebook_userId + ";" + granted_permissions);
                        });

                        //if callback function specified
                        if (callback) {
                            callback();
                        }
                        break;
                    default:
                        break;
                }
            }
            else {
                //not logged in
            }
        }, { perms: requestedPerms });
    },
    logout: function() {
        var sFound = false;
        FB.logout(function(r) {
            sFound = true;
            server_callback("logout:");
        });

        //not logged into facebook - update server
        if (!sFound) {
            server_callback("logout:");
        }
    },
    declareEvents: function() {
        FB.Event.subscribe('auth.sessionChange', function(r) {
            switch (r.status) {
                case "connected":
                    facebook_logged_in = true;
                    facebook_userId = r.session.uid;
                    break;
                case "unknown":
                    break;
                default:
                    facebook_logged_in = false;
            }
        });
    },
    get_granted_permissions: function(callback) {
        FB.api(
        {
            method: "fql.query",
            query: "SELECT " + requestedPerms + " FROM permissions WHERE uid=" + facebook_userId
        },

        function(response) {
            var permission = response[0];
            var allPerms = requestedPerms.split(',');

            //check status of each permission
            for (i = 0; i < allPerms.length; i++) {
                if (permission[allPerms[i]] == 1) {
                    granted_permissions += allPerms[i] + ",";
                }
            }
            callback();
        });
    },
    user_has_permission: function(permission) {
        return granted_permissions.indexOf(permission) > -1;
    },
    stream_publish: function(uid, status_message, callback, failed_callback) {
        if (facebook_logged_in && DQFacebook.user_has_permission("publish_stream")) {

            var path = (uid === facebook_userId ? 'me' : uid) + "/feed";

            FB.api(path, 'post', { message: status_message, picture: "http://www.adailyquiz.co.uk/im/adq2/global/fb-logo.gif", link: "http://www.adailyquiz.co.uk?a=FB", name: "A Daily Quiz", description: "ADailyQuiz gives away a prize to the player in the winning position on the leaderboard everyday" }, function(response) {
                if (!response || response.error) {
                    alert('Error occured');
                    callback(null);
                }
                else {
                    callback(response);
                }
            });
        }
        else {
            //get permission to post to wall
            FB.login(function(r) {
                if (r.session && facebook_logged_in) {
                    if (r.perms.indexOf("publish_stream") > -1) {
                        DQFacebook.get_granted_permissions(function() {
                            if (DQFacebook.user_has_permission("publish_stream")) {
                                DQFacebook.stream_publish(uid, status_message, callback);
                            }
                        });
                    }
                }
                else if (r.session) {
                    facebook_userId = r.session.uid;
                    server_callback("login:" + facebook_userId);
                }
                else {
                    if (failed_callback)
                        failed_callback();
                }
            }, { perms: "publish_stream" });
        }
    }
};

DQFacebook.Utils = {
    refreshPage: function() {
        //redirect back to page in case of postbacks
        location.reload(true);
    }
};

