/**
 * Facebook-related community functions.
 */
var KinoFB = {

    reloadUrl: '',

    init: function() {

        FB.Event.subscribe('auth.logout', function(response) {

            ('object' == typeof response && response.status == 'unknown') && KinoFB.currentFBuser.logout();
        });

        FB.Event.subscribe('auth.login', function(response) {

            if (response.authResponse) {

                KinoFB.showLoginNotification();
                KinoFB.currentFBuser.session = response.authResponse, KinoFB.getCurrentFBuser();
            }
        });

        FB.getLoginStatus(function(response) {

            if (response.authResponse) {

                KinoFB.currentFBuser.session = response.authResponse, KinoFB.getCurrentFBuser();
            }
        });
    },

    getCurrentFBuser: function() {

        KinoFB.getFBuser('me');
    },

    getFBuser: function(fbuid) {

        FB.api('/' + fbuid, function(fbuser) {

            if ('undefined' != typeof fbuser.id) {

                KinoFB.handleFBresponse('getUser', fbuser);
            }
        });
    },

    /**
     * since we don't have $.when.done, because of the old version of jquery ... ;)
     *
     * handle async responses from FB-Requests
     * and executes further actions
     *
     * @param string responseType
     * @param object data
     */
    handleFBresponse: function(responseType, data){

        switch (responseType) {

            case 'getUser':

                if (KinoFB.currentFBuser.session.userID == data.id && (KinoFB.currentFBuser.userdata = data, !KinoFB.currentFBuser.isLoggedIn)) {

                    KinoFB.currentFBuser.isLoggedIn = true, ('undefined' != typeof preventFBredraw && !preventFBredraw) && KinoFB.triggerLogin();
                }
                break;
        }
    },

    triggerLogin: function() {

        jQuery.post('/facebook/ajax/login', {
            fbuid: KinoFB.currentFBuser.userdata.id,
            format: 'json',
            ts: (new Date).getTime()
        },
        function(response) {

            if (response.status == 'success') {

                (KinoFB.reloadUrl != '') ? window.location.href = KinoFB.reloadUrl : window.location.reload();
            }
        });
    },

    triggerLogout: function() {},

    showLoginNotification: function() {

        $('#fb_login_root').empty().html('<h3 style="color: white;">facebook-Anmeldung läuft...</h3>');
    },

    /**
     * Add a new movie reminder for a given fb-user.
     * If the user can post, but does not post, do not mark the movie.
     *
     * @param integer mid - the movie-id to mark
     * @param boolean canPost - indicates whether to send a fb-post or just mark the movie
     * @param boolean filmStarted - indicates whether the film has started yet or not
     */
    addMovieReminder: function(mid, canPost, filmStarted) {

        if (KinoFB.currentFBuser.isLoggedIn) {

            if (canPost)  {

                FB.ui({
                    method: 'feed',
                    name: 'Ich will "' + fbMovieData.name + '" sehen',
                    picture: fbMovieData.pURL,
                    link: fbMovieData.mURL,
                    caption: fbMovieData.optData,
                    description: fbMovieData.desc,
                    display: 'popup'
                },
                function(response) {

                    if (response && response.post_id) {

                        jQuery.post('/facebook/ajax/storefbpost', {
                            pid: response.post_id,
                            type: 'm_remind',
                            mid: mid,
                            format: 'json',
                            ts: (new Date).getTime()
                        });
                    }

                    KinoFB.setMovieReminder(mid, filmStarted);
                });
            } else {

                // User is not allowed to post to FB. Show reminder message.
                KinoFB.setMovieReminder(mid, filmStarted);
            }
        } else {

            KinoFB.reloadUrl = location.href + '?click=wantToSeeButton#movie-voting-teaser';

            // Show dialog with some information before forwarding to facebook login
            var dialog = new Emv.Dialog();
            dialog.setDialogClass('dynamic-dialog');
            dialog.openDialogWithDivContent('showLoginInfoBeforeVoting', 590);

            if (!filmStarted) {

                // If dialog is closed with close icon, use temp. user to get reminder to work.
                $('span.ui-icon-closethick').bind('click', function(event, ui) {

                    $('span.ui-icon-closethick').unbind('click');
                    dialog.setDialogClass('dynamic-dialog no-icon');
                    $('#jq-dialog').unbind('dialogbeforeclose');
                    dialog.openDialogWithDivContent('fbwanttoseereminder', 590);
                    return false;
                });
            }
        }
    },

    /**
     * Set movie reminder.
     *
     * @param integer mid
     * @param boolean filmStarted
     */
    setMovieReminder: function(mid, filmStarted) {

        jQuery.post('/facebook/ajax/reminder', {
            mid: mid,
            format: 'json',
            ts: (new Date).getTime()
        },
        function(response) {

            if (response.status == 'success') {

                if (filmStarted) {

                    KinoFB.Layout.closeReminderForm();
                } else {

                    var dialog = new Emv.Dialog();
                    dialog.setDialogClass('dynamic-dialog no-icon');
                    dialog.openDialogWithDivContent('fbwanttoseereminder', 590);
                }
            }
        });
    },

    /**
     * Activate movie remidner.
     *
     * @param integer mid
     * @param boolean needmail
     */
    activateMovieReminder: function(mid, needmail) {

        jQuery.post('/facebook/ajax/reminder', {
            mid: mid,
            reminder: 'activate',
            cmail: 0,
            email: $('#reminderEMail').val(),
            format: 'json',
            ts: (new Date).getTime()
        },
        function(response) {

            (response.status == 'success') ? KinoFB.Layout.closeReminderForm() : Emv.Form.ajaxBind(formId, buttonId, forwardUrl, [660, 65]);
        });
    },

    /**
     * Movie voting.
     *
     * @param integer mid
     * @param string vote
     * @param string type
     * @param boolean canPost
     */
    castSimpleVote: function(mid, vote, type, canPost) {

        jQuery.post('/facebook/ajax/castvote', {
            mid: mid,
            vote: vote,
            type: type,
            format: 'json',
            ts: (new Date).getTime()
        });

        if (KinoFB.currentFBuser.isLoggedIn) {

            var theNot = '!';
            if (canPost) {

                if (vote == '-1') {

                    theNot = ' nicht!';
                }

                FB.ui({
                    method: 'feed',
                    name: '"' + fbMovieData.name + '" gef\u00E4llt mir' + theNot,
                    picture: fbMovieData.pURL,
                    link: fbMovieData.mURL,
                    caption: fbMovieData.optData,
                    description: fbMovieData.desc,
                    display: 'popup'
                },
                function(response) {

                    if (response && response.post_id) {

                        jQuery.post('/facebook/ajax/storefbpost', {
                            pid: response.post_id,
                            type: 'm_like',
                            mid: mid,
                            format: 'json',
                            ts: (new Date).getTime()
                        });
                    }
                });
            }
        }
    },

    /**
     * Post after voting.
     *
     * @param boolean canPost
     */
    postAfterVoting: function(canPost) {

        if (KinoFB.currentFBuser.isLoggedIn) {

            if (canPost) {

                FB.ui({
                    method: 'feed',
                    name: 'Ich habe gerade "' + fbMovieData.name + '" bewertet. - Was denkst du?',
                    picture: fbMovieData.pURL,
                    link: fbMovieData.mURL,
                    caption: fbMovieData.optData,
                    description: fbMovieData.desc,
                    display: 'popup'
                },
                function(response) {

                    if (response && response.post_id) {

                        jQuery.post('/facebook/ajax/storefbpost', {
                            pid: response.post_id,
                            type: 'm_vote',
                            mid: mid,
                            format: 'json',
                            ts: (new Date).getTime()
                        });
                    }
                });
            }
        }
    },

    /**
     * Invite friends.
     *
     * @param string type
     * @param integer mid
     */
    inviteFriends: function(type, mid) {

        var mdata  = 'invite;movie=0';
        var filter = 'app_non_users';
        var mTitle = 'Lade deine Freunde zu kino.de ein!';
        var mText  =  'l\u00E4d dich zu kino.de, Deutschlands gr\u00F6\u00DFter Kino-Community, ein.';
        if (type == 'see' || type == 'opinion') {

            filter = 'all';
            mTitle = 'Frag deine Freunde!';
            mdata = 'type=' + type + ';movie=' + mid;
            if (type == 'see') {

                mText = 'm\u00F6chte wissen, ob du dir den Film ansehen willst.';
            } else if (type == 'opinion') {

                mText = 'm\u00F6chte wissen, wie dir ein Film gefallen hat.';
            }
        }

        FB.ui({
            method: 'apprequests',
            filters: [filter],
            title: mTitle,
            message: mText,
            data: mdata,
            display: 'popup'
        },
        function(response) {

            if (response) {

                jQuery.post('/facebook/ajax/storefbrequest', {
                    fbuid: KinoFB.currentFBuser.userdata.id,
                    rqids: response,
                    type: type,
                    mid: mid,
                    format: 'json',
                    ts: (new Date).getTime()
                });
            }
        });
    },

    /**
     * Game voting.
     *
     * @param integer gid
     * @param string vote
     * @param string type
     * @param boolean canPost
     */
    castSimpleGameVote: function(gid, vote, type, canPost) {

        jQuery.post('/facebook/ajax/castgamevote', {
            gid: gid,
            vote: vote,
            type: type,
            format: 'json',
            ts: (new Date).getTime()
        });

        if (KinoFB.currentFBuser.isLoggedIn) {

            var theNot = '!';
            if (canPost) {

                if (vote == '-1') {

                    theNot = ' nicht!';
                }

                FB.ui({
                    method: 'feed',
                    name: '"' + fbMovieData.name + '" gef\u00E4llt mir' + theNot,
                    picture: fbMovieData.pURL,
                    link: fbMovieData.mURL,
                    caption: fbMovieData.optData,
                    description: fbMovieData.desc,
                    display: 'popup'
                },
                function(response) {

                    if (response && response.post_id) {

                        jQuery.post('/facebook/ajax/storefbpost', {
                            pid: response.post_id,
                            type: 'm_like',
                            gid: gid,
                            format: 'json',
                            ts: (new Date).getTime()
                        });
                    }
                });
            }
        }
    },

    /**
     * Post after game voting.
     *
     * @param boolean canPost
     */
    postAfterGameVoting: function(canPost) {

        if (KinoFB.currentFBuser.isLoggedIn) {

            if (canPost) {

                FB.ui({
                    method: 'feed',
                    name: 'Ich habe gerade "' + fbMovieData.name + '" bewertet. - Was denkst du?',
                    picture: fbMovieData.pURL,
                    link: fbMovieData.mURL,
                    caption: fbMovieData.optData,
                    description: fbMovieData.desc,
                    display: 'popup'
                },

                function(response) {

                    if (response && response.post_id) {

                        jQuery.post('/facebook/ajax/storefbpost', {
                            pid: response.post_id,
                            type: 'm_vote',
                            gid: gid,
                            format: 'json',
                            ts: (new Date).getTime()
                        });
                    }
                });
            }
        }
    },

    /**
     * Invite game friends.
     *
     * @param string type
     * @param integer mid
     */
    inviteGameFriends: function(type, mid) {

        var mdata  = 'invite;game=0';
        var filter = 'app_non_users';
        var mTitle = 'Lade deine Freunde zu kino.de ein!';
        var mText  =  'l\u00E4d dich zu kino.de, Deutschlands gr\u00F6\u00DFter Kino-Community, ein.';
        if (type == 'opinion') {

            filter = 'all';
            mTitle = 'Frag deine Freunde!';
            mdata = 'type=' + type + ';game=' + mid;
            mText = 'm\u00F6chte wissen, wie dir ein Game gefallen hat.';
        }

        FB.ui({
            method: 'apprequests',
            filters: [filter],
            title: mTitle,
            message: mText,
            data: mdata,
            display: 'popup'
        },
        function(response) {

            if (response) {

                jQuery.post('/facebook/ajax/storefbgamerequest', {
                    fbuid: KinoFB.currentFBuser.userdata.id,
                    rqids: response,
                    type: type,
                    mid: mid,
                    format: 'json',
                    ts: (new Date).getTime()
                });
            }
        });
    },

    /**
     * Delete fb request.
     *
     * @param string rqid
     */
    deleteFBrequest: function(rqid) {

        jQuery.post('/facebook/ajax/deletefbrequest', {
            rqid: rqid,
            format: 'json',
            ts: (new Date).getTime()
        });
    },

    /**
     * Current FB Userdata.
     */
    currentFBuser: {

        session: null,
        userdata: null,
        isLoggedIn: false,

        logout: function() {

            jQuery.post('/facebook/ajax/logout', {
                format: 'json',
                ts: (new Date).getTime()
            },
            function(response) {

                if (response.status == 'success') {

                    KinoFB.currentFBuser.session = null;
                    KinoFB.currentFBuser.userdata = null;
                    KinoFB.currentFBuser.isLoggedIn = false;
                    window.location.reload();
                }
            });
        }
    },

    /**
     * Facebook-related layout-manipulation.
     */
    Layout: {

        isUserLoggIn: function() {

            return KinoFB.currentFBuser.isLoggedIn;
        },

        changeWantToSeeState: function() {

            $('#wantToSeeButton').hide();
            $('#wantToSeeTextActive').show();
            $('#fbwanttosee').hide();
        },

        /**
         * @param boolean showReminderLink
         */
        closeReminderForm: function(showReminderLink) {

            (showReminderLink) && $('#notYetRemindedLink').show();

            $('#fbwanttosee').show();
            $('#wantToSeeTextActive').show();
            $('#wantToSeeButton').hide();
        }
    }
};
