﻿var FBHelper = {

    //Properties

    permissions: '',
    debugMode: false,
    isFlashReady: false,
    flashObj: null,
    appLink: null,

    setFlashReady: function () { FBHelper.isFlashReady = true; },

    debugConsole: function (message) {
//        if (window.console && this.debugMode) {
//            for (i = 0; i < arguments.length; i++)
//                console.log(arguments[i]);
//        }
    },

    init: function (applicationID, applicationLink, permissions, isDebugMode) {

        $('body').prepend('<div id="fb-root"></div>');
        $('body').append('<form id="mc-root"></form>');

        $.getScript(window.location.protocol + '//connect.facebook.net/en_US/all.js', function () {
            FB._https = true;
            FB.init({
                appId: applicationID,
                status: true, // check login status
                cookie: true, // enable cookies to allow the server to access the session
                xfbml: true,  // parse XFBML
                oauth: true
            });

            FBHelper.globalDispatcher('onInitSuccess');
            window.fbAsyncInit = function () {
                FB.Canvas.setAutoResize();
            }
            FB.getLoginStatus(function (response) {
                if (response.authResponse) {
                    FBHelper.debugConsole('logged in and connected user, someone you know');
                    FBHelper.globalDispatcher('onUserConnected', response);
                } else {
                    FBHelper.debugConsole('no user session available, someone you dont know');
                    FBHelper.globalDispatcher('onUserNotConnected', response);
                }
            });



        });


        FBHelper.debugMode = isDebugMode;
        FBHelper.permissions = permissions;
        FBHelper.appLink = applicationLink;

        FBHelper.debugConsole(
            'ApplicationID' + ' : ' + applicationID,
            'ApplicationLink' + ' : ' + applicationLink,
            'Permissions' + ' : ' + permissions,
            'Debug Mode' + ' : ' + isDebugMode
            );
    },

    globalDispatcher: function (eventType) {
        $(document).trigger(eventType, (Array.prototype.slice.call(arguments).slice(1)));

        try 
        {
            if (FBHelper.isFlashReady && FBHelper.flashObj) {
                if (arguments.length > 1)
                    FBHelper.flashObj[eventType](Array.prototype.slice.call(arguments).slice(1));
                else {
                    FBHelper.flashObj[eventType]();
                }
            }

            this.debugConsole(Array.prototype.slice.call(arguments).slice(0));
        }
        catch (err) {
            //Handle errors here
        }
        


    },

    listener: function (eventType, callback) {
        $(document).bind(eventType, function (e, data) {
            callback(data);
            this.debugConsole(eventType + ' : ' + data);
        });
    },


    /*
    Events
    - onLoggedIn
    - onLoginFail
    */
    args: null,
    login: function (triggerName) {
        FB.login(function (response) {
            if (response.authResponse) {
                FBHelper.globalDispatcher('on' + triggerName + 'Success', response);
            } else {
                // user is not logged in
                FBHelper.globalDispatcher('on' + triggerName + 'Fail', response);
            }
        }, { scope: this.permissions });
    },

    /*
    Events
    - onLoggedOut
    */
    logout: function (triggerName) {
        FB.logout(function (response) {
            // user is now logged out
            FBHelper.globalDispatcher('on' + triggerName + 'Success', response);

        });
    },

    api: function (params, triggerName) {
        FB.api(params, function (response) {
            FBHelper.globalDispatcher(triggerName, response);
        });
    },

    /*
    Dialog Types
    - apprequests (application specific requests)
    (Event) onAppRequestSent
    - dialog (custom for personal use)
    - publish (post to user wall)
    (Event) onPublished
    (Event) onPublishFail      
    - login (login and grand permissions)
    - 
    */

    showDialog: function (dialogType, triggerName) {

        switch (dialogType) {
            case 'apprequests':
                FB.ui({ method: 'apprequests',
                    message: arguments[2],
                    data: arguments[3],
                    filters: ['app_non_users'],
                    title: arguments[4]

                }, function (response) {
                    if (response && response.to) {
                        FBHelper.globalDispatcher('on' + triggerName + 'Success', response);
                    } else {
                        FBHelper.globalDispatcher('on' + triggerName + 'Fail', response);
                    }
                });
                break;

            case 'dialog':
                $(arguments[1]).dialog();
                break;

            /*case 'feed':
            var mediaObj = arguments[1];
            FB.ui({
            method: 'feed',
            name: mediaObj.name,
            link: mediaObj.link,
            picture: mediaObj.picture,
            caption: mediaObj.caption,
            description: mediaObj.description,
            message: mediaObj.message
            }, function(response) {
            if (response && response.post_id) {
            FBHelper.globalDispatcher('onPublished', response);
            } else {
            FBHelper.globalDispatcher('onPublishFail', response);
            }
            });
            break;*/ 

            /*' {*actor*} */ 

            case 'publish':
                var mediaObj = arguments[1];
                var publishBody = {
                    method: 'stream.publish',
                    message: '',
                    attachment: {
                        name: mediaObj.name,
                        caption: mediaObj.caption,
                        description: mediaObj.description,
                        media: [],
                        href: this.appLink
                    },
                    user_message_prompt: ''
                }
                if (mediaObj.media[0].substr(mediaObj.media[0].lastIndexOf('.')) == '.swf') {
                    var flashContent = {
                        "type": "flash",
                        "swfsrc": "mediaObj.media[0]",
                        "imgsrc": "mediaObj.media[1]",
                        "width": "80",
                        "height": "60",
                        "expanded_width": "160",
                        "expanded_height": "120"
                    }
                    publishBody.attachment.media.push(flashContent);
                }
                else {

                    for (i = 0; i < mediaObj.media.length; i++) {
                        publishBody.attachment.media.push({
                            'type': 'image',
                            'src': mediaObj.media[i],
                            'href': this.appLink
                        });
                    }
                }

                FB.ui(publishBody, function (response) {
                    if (response && response.post_id) {
                        FBHelper.globalDispatcher('on' + triggerName + 'Success', response);
                    } else {
                        FBHelper.globalDispatcher('on' + triggerName + 'Fail', response);
                    }
                });
        }
    },

    submit: function (action, obj) {
        $('#mc-root').attr("action", action);
        $('#mc-root').attr("method", "POST");
        for (var key in obj) {
            $('#mc-root').append('<input type="hidden" name="' + key + '" value="' + obj[key] + '" />');
        }

        FBHelper.debugConsole($('#mc-root'));
        document.getElementById('mc-root').submit();
        //$('#mc-root').submit();
    }

}


