
/*  new/common/templates/widgets/widget_fbdm/js/script.js  */
(function($) {
    /**
     * Routines to track events to Google Analytics
     * @param {String} sType Holds the type of the event (Category field on Google Analytics)
     * @param {String} sAction Action identifier
     * @param {String} sLabel Additional data or Action Label
     * @param {Function} fCallback Receive the callback function triggered after event track
     */
    $.fn.sendGAEventFbdm = function (sType, sAction, sLabel, fCallback) {
        if (_gaq && sAction) {
            _gaq.push(['_set', 'hitCallback', null]); //cleaning callback
            if (fCallback && typeof fCallback == 'function') {
                _gaq.push(['_set', 'hitCallback', fCallback]); //registering callback
            }
            _gaq.push(['_trackEvent', sType + ':' + ((tracking['cid'] != 1508) ? tracking['cid'] :  'DO ' + tracking['petition-id']), sAction, sLabel || 'no data']); //registering event
        } else {
            if (fCallback && typeof fCallback == 'function') {
                fCallback(); //running callback anyway
            }
        }
    }

    selectedFriendsCounter = 0;
    $.fn.selectFriendsCounter = function() {

        switch (window.selectedFriendsCounter) {

            case 2:
                $.fn.sendGAEventFbdm("FBDM", "DM Select Friends", 'Selected 1+');
                break;

            case 6:
                $.fn.sendGAEventFbdm("FBDM", "DM Select Friends", 'Selected 5+');
                break;

            case 11:
                $.fn.sendGAEventFbdm("FBDM", "DM Select Friends", 'Selected 10+');
                break;

            case 26:
                $.fn.sendGAEventFbdm("FBDM", "DM Select Friends", 'Selected 25+');
                break;

            case 51:
                $.fn.sendGAEventFbdm("FBDM", "DM Select Friends", 'Selected  50+');
                break;

            case 101:
                $.fn.sendGAEventFbdm("FBDM", "DM Select Friends", 'Selected 100+');
                break;
        }
    };

    /**
     * Tracks custom events to Optimizely
     * @param {String} sEventName Event name to track
     */
    $.fn.sendOptimizelyEvent = function(sEventName) {
        window['optimizely'] = window['optimizely'] || [];
        window.optimizely.push(["trackEvent", sEventName]);
    };

    $.fn.FBTagFriendsWidget = function(options) {
        var oOptions = {
            iTaggingLimit: parseInt($(this).data('tagging-limit'), 10) || 0,
            iDmLimit: parseInt($(this).data('dm-limit'), 10) || 0,
            scope: 'user_birthday'
        };

        if ($(this).data('pid')) {
            oOptions.iPid = parseInt($(this).data('pid'), 10) || 0;
        }

        var sAccessToken = null;
        var aAuthResponse = null;
        var sUserId = null;

        var self = this;
        var bIsLoggedIn = false;
        var bInitialized = false;
        var oRunPeriodsTimer;
        var bFinishedSharing;
        var bSignAndShareInvoked;
        var iBoxIndex = 0;
        var bProcessingPost = false;

        var suggestedCounter = 0;

        self.cid = 0;

        //controls if click on suggested should activate or deactivate checkboxes
        window.bSuggestedSelectorIsActive = false;

        //private references to elements
        var sPopupId = $(this).attr('id');
        var jList = $('#' + sPopupId + 'List');
        var jButton = $('#' +sPopupId + 'Button');
        var jSearch = $('#' + sPopupId + 'SearchField');
        var jMessage = $('#' + sPopupId + 'Message');
        var jTitle = $('#' + sPopupId + 'Title');
        var jDescription = $('#' + sPopupId + 'Text');
        var jLink = $('#' + sPopupId + 'Link');

        $.extend(oOptions, options || {});

        //depends on incoming settings
        var iGlobalFriendsLimit = getMaxFriendsCount();

        var default_values;

        //register events
        jButton.click(function() {
            if (!bProcessingPost) {
                bProcessingPost = true;
                tagFriends();
            }
            return false;
        });

        jSearch.keyup(function() {
            var sSearchString = $(this).val().toUpperCase();
            if ($.trim(sSearchString) === '') {
                $("li.fbFriendLi").each(function() {
                    $(this).show();
                });
                $('#clear_search').hide();
            } else {
                $("li.fbFriendLi").each(function() {
                    var sTempName = $(this).data("fname").toUpperCase();
                    if (sTempName.indexOf(sSearchString) < 0) {
                        $(this).hide();
                    } else {
                        $(this).show();
                    }
                });
                $('#clear_search').show();
            }
        });

        $('#clear_search').on('click', function(){
            jSearch.val('');
            jSearch.trigger('keyup');
            jSearch.focus();
        });

        this.close = function() {
            if (oOptions.bForceFinishedCallback) {
                oOptions.finishedCallback();
            } else {
                $.colorbox.close();

                var condition = oOptions.finishedCallback && typeof oOptions.finishedCallback == 'function' &&
                    bSignAndShareInvoked;

                if (condition) {
                    oOptions.finishedCallback();
                }
            }

            $('body').trigger('sharing_complete');
        };

        //the main public method - does all necessary cheks and show the popup
        this.process = function(bCalledFromSignAndShare, custom_cid) {
            self.cid = custom_cid || cid;
            bFinishedSharing = false;
            bSignAndShareInvoked = bCalledFromSignAndShare;

            if (!bInitialized) {
                registerGlobalCallbacks();
            }
            $(document).trigger("fbdm:ready");
            if (bCalledFromSignAndShare && oOptions.bIntegrateSignAndShare) {
                bIsLoggedIn = true;
                sAccessToken = FB.getAccessToken();
                sUserId = FB.getUserID();
                aAuthResponse = FB.getAuthResponse();

                self.show();
            } else if (window.bFbdmProcessFirstCall) {
                bIsLoggedIn = true;
                window.bFbdmProcessFirstCall = false;
                friendCounterAndLoadFriends();
            } else {
                if (!bIsLoggedIn) {
                    runFBLogin();
                } else {
                    self.show();
                }
            }
        };

        function getFBMethod () {
            return oOptions.sMethod.replace(/^(\w)([^.]*)\.(\w)(.*)/, function(a,b,c,d,e) {
                return b.toUpperCase() + c + d.toUpperCase() + e;
            });
        }

        function runFBLogin () {
            var sLink = $('<textarea />').html(jLink.html()).text();
            var sPicture = $('meta[property="og:image"]').attr('content');
            sPicture = (sPicture != undefined) ? sPicture : '';

            var sName = jTitle.html();
            var sDescription = jDescription.html();

            if (typeof share_data[self.cid].facebook !== 'undefined') {
                sName = share_data[self.cid].facebook.name;
                sDescription = share_data[self.cid].facebook.description;
            }

            var oLoginOptions = {
                'action': 'login',
                'failedOption': 'shareDialog',
                'link': sLink.replace(/\?fbdm|\?d/, '?f'),
                'picture': sPicture,
                'name': sName,
                'description': sDescription,
                'cid' : self.cid,
                'scope' : oOptions.scope
            };
            var sUrl = '/act/facebook_login.php?' + $.param(oLoginOptions);
            window.open(sUrl,'fbLoginWindow','height=600,width=900');
        }

        function runShareDialog () {
            var sLink = $('<textarea />').html(jLink.html()).text();
            var sPicture = $('meta[property="og:image"]').attr('content');
            sPicture = (sPicture != undefined) ? sPicture : '';

            var sName = jTitle.html();
            var sDescription = jDescription.html();

            if (typeof share_data[self.cid].facebook !== 'undefined') {
                sName = share_data[self.cid].facebook.name;
                sDescription = share_data[self.cid].facebook.description;
            }

            var oLoginOptions = {
                'action': 'login',
                'failedOption': 'shareDialog',
                'link': sLink.replace(/\?fbdm|\?d/, '?f'),
                'picture': sPicture,
                'name': sName,
                'description': sDescription,
                'cid' : self.cid
            };
            var sUrl = '/act/facebook_login.php?' + $.param(oLoginOptions);
            window.open(sUrl,'fbLoginWindow','height=600,width=900');
        }

        function showCopyLinkTool(bDisableEffects) {
            var bEnableEffects = false;

            if ($('#suggestedMessageWrapper').is(":visible")) {
                $('#suggestedMessageWrapper').hide();
                bEnableEffects = true;
            }

            $('.message-bar .message-bar-column').css('width', '');

            if (!bDisableEffects && (!$('#copyLinkWrapper').is(":visible") || bEnableEffects)) {
                $('#copyLinkWrapper').fadeIn(1500);
                $('#copyLinkWrapper').effect("pulsate", {times:1}, 1000);
            } else if ($('#copyLinkWrapper').is(":hidden")) {
                $('#copyLinkWrapper').show();
                $.colorbox.resize();
            }
        }

        function hideCopyLinkTool() {
            if ($('#copyLinkWrapper').is(':visible')) {
                $('.message-bar .message-bar-column').eq(0).width(0);
                $('.message-bar .message-bar-column').eq(1).width('100%');
                $('#copyLinkWrapper').hide();
                $.colorbox.resize();
            }
        }

        function friendCounterAndLoadFriends() {
            FB.api({
                method: 'fql.query',
                query: 'SELECT friend_count FROM user WHERE uid = me()',
                access_token: sAccessToken
            }, function(oResponse) {
                window.iFriendsCounter = parseInt(oResponse[0].friend_count);
                loadContactsTable(false);
            });
        }

        //shows the colorbox with contacts
        this.show = function() {
            bProcessingPost = false;

            if (jList.children().length === 0  && !window.bFbFriendsPermissionGranted) {
                friendCounterAndLoadFriends();
            }

            //if used along S&S, and user has entered a reason,
            //fetch the entered message into the message field,
            //move the message field to the bottom of the widget
            //and hide the 'suggested message' box
            var jTextarea = $('textarea#fb_reason');
            var jContainer = $('#dialogTagFBShareMessageContainer');
            if (jTextarea.length !== 0) {
                if ($.trim(jTextarea.val()) !== '') {
                    $('#suggestedMessageWrapper').hide();
                    jMessage.val(jTextarea.val());
                    if (typeof tracking['petition-id'] === 'undefined') {
                        jContainer.addClass('bottom');
                        jContainer.parent().append(jContainer);
                    }
                    // show 'copy link' tool if there are no avaaz links in the message
                    if (!hasAvaazUrl()) {
                        showCopyLinkTool(true);
                    }
                } else {
                    jContainer.removeClass('bottom');
                    jContainer.parent().append(jContainer);
                }
                if ($('#dialogTagFBFriendsMessage').val().length > 0) {
                    $('#dialogTagFBFriendsMessage').trigger('change');
                }
            }

            //selector suggested
            $('#dialogTagFBSelectorSuggested').click(function() {

                if (window.bSuggestedSelectorIsActive) {
                    $('#dialogTagFBFriendsSelectors li').removeClass('active');

                    //Uncheck suggested="1" checkboxes and trigger checkBoxChange for the last one
                    $('.fb-friends-list input[suggested="1"]').prop('checked', false).trigger('checkBoxChange', true).last().trigger('checkBoxChange');
                } else {
                    $('#dialogTagFBFriendsSelectors li').removeClass('active');
                    $(this).addClass('active');

                    //all friends are selected, unselecting all first
                    //not unselecting all every time suggested selector got clicked because user can lose some selection made
                    if ($('.fb-friends-list input:checked').length == window.iFriendsCounter) {
                         $('.fb-friends-list input').prop('checked', false).trigger('checkBoxChange');
                    }

                    $('.fb-friends-list input[suggested="1"]').prop('checked', true).trigger('checkBoxChange', true).last().trigger('checkBoxChange');
                }

                window.bSuggestedSelectorIsActive = !window.bSuggestedSelectorIsActive;
            });

            //selector all
            $('#dialogTagFBSelectorAll').click(function() {

                $('#dialogTagFBFriendsSelectors li').removeClass('active');
                $(this).addClass('active');

                //Check all checkboxes and trigger checkBoxChange for the last one
                $('.fb-friends-list input', self).prop('checked', true).trigger('checkBoxChange', true).last().trigger('checkBoxChange');

                window.bSuggestedSelectorIsActive = false;
            });

            //selector none
            $('#dialogTagFBSelectorNone').click(function() {

                $('#dialogTagFBFriendsSelectors li').removeClass('active');
                $(this).addClass('active');

                //Uncheck all checkboxes and trigger checkBoxChange for the last one
                $('.fb-friends-list input', self).prop('checked', false).trigger('checkBoxChange', true).last().trigger('checkBoxChange');

                window.bSuggestedSelectorIsActive = false;
            });

            $('#dialogTagFBFriendsDoneSending').click(function() {
                $.fn.sendGAEventFbdm("FBDM", "DM Done Sending");
                self.close();
            });

            $('#dialogTagFBFriendsCloseButton').click(function() {
                self.close();
            });

            jMessage.keyup(function() {
                checkSendButtonEnabling();
            });

            jMessage.change(function() {
                checkSendButtonEnabling();
            });

            $.colorbox({
                opacity: 0.5,
                inline: true,
                overlayClose: false,
                scrolling: false,
                href: 'div#' + sPopupId,
                showClose: false,
                closeButton: false,
                onComplete: function() {

                    $.fn.sendGAEventFbdm("FBDM", "DM Open");

                    //GA handler: change listener FBDM message box
                    dialogTagFBFriendsMessageChange = false;
                    $('#dialogTagFBFriendsMessage').keyup(function(e){
                        if (dialogTagFBFriendsMessageChange == false){
                            dialogTagFBFriendsMessageChange = true;
                            $.fn.sendGAEventFbdm("FBDM", "DM Message");
                        }
                        return true;
                    });

                    $.InFieldLabelsSetPosition();

                    if (bSuggestedFeatureEnabled) {
                        $('#dialogTagFBSelectorSuggested').show();
                        $('#dialogTagFBSelectorSuggested').trigger('click'); //autoselecting suggested friends
                    }
                },

                onClosed:function() {
                    $.fn.sendGAEventFbdm("FBDM", "DM Close");
                }

            });
        };

        this.init_new_form = function (data) {
            loadContactsTable(true);

            set_form_values(data);
            //init form
            $('#dialogTagFBShareMessageContainer label').show();
            $('#suggestedMessageWrapper').show();
            $('#dialogTagFBFriendsMessage').val('').trigger('change');
            $('#copyLinkWrapper').hide();
            $('.message-bar .message-bar-column').eq(0).width('50%');
            $('.message-bar .message-bar-column').eq(1).width('50%');
        };

        function set_form_values(data) {
            set_default_values();
            var values = $.extend(default_values, data);
            for (var h in values) {
                set_value(h, values[h]);
            }
        }

        function set_value (key, value) {
            switch (key) {
                case 'title':
                    $('#dialogTagFBFriendsTitle').html(value);
                    break;
                case 'text':
                    $('#dialogTagFBFriendsText').html(value);
                    break;
                case 'href':
                    $('#dialogTagFBFriendsLink').html(value);
                    break;
                case 'header_title':
                    $('#dialogTagFBFriendsHeaderTitle').html(value);
                    break;
                case 'header_text':
                    $('#dialogTagFBFriendsHeaderMessage').html(value);
                    break;
                case 'suggested':
                    $('#suggestedMessageText').data('text', value).html(value);
                    break;

            }
        }

        function set_default_values () {
            if (!default_values) {
                default_values = {
                    title: $('#dialogTagFBFriendsTitle').html(),
                    text: $('#dialogTagFBFriendsText').html(),
                    href: $('#dialogTagFBFriendsLink').html(),
                    header_title: $('#dialogTagFBFriendsHeaderTitle').html(),
                    header_text: $('#dialogTagFBFriendsHeaderMessage').html(),
                    suggested: $('#suggestedMessageText').data('text')
                };
            }
        }

        function checkSendButtonEnabling() {
            if (hasAvaazUrl() && window.selectedFriendsCounter > 0) {
                jButton.removeClass('disabled');
            } else {
                jButton.addClass('disabled');
            }

            if (hasAvaazUrl()) {
                hideCopyLinkTool();
            } else {
                if ($.trim($('#dialogTagFBFriendsMessage').val()) != '') {
                    showCopyLinkTool(false);
                }
            }

            if (window.selectedFriendsCounter != 1) {
                $('#placeholder-message-blurb').html(oFbMessageBlurbs.messageButtonLabelPlural);
            } else {
                $('#placeholder-message-blurb').html(oFbMessageBlurbs.messageButtonLabelSingular);
            }
        }

        //adds one friend to the list
        function addFriendRow(oItem) {

            if (++suggestedCounter <= iNumberOfSuggestedFriends) {
                var bSuggested = true;
            } else {
                var bSuggested = false;
            }

            var sHtml = "<li class='fbFriendLi' data-fname=\"" + oItem.name + "\"><div class='fb-friends-list-item'>";

            sHtml += "<div class='fb-checkbox-container cell'><input type='checkbox' " + ((bSuggested) ? "suggested='1' " : "") + "name='fbFriendOffset" + window.iFriendListOffset + "' id='fbFriendCheckbox_" + oItem.uid + "' data-fbid='" + oItem.uid + "'></div>";

            //fb user image and name
            sHtml += "<div class='fb-user-img cell'>" + getPictureHTML(oItem) + "</div><div class='last-child cell'>" + oItem.name;

            sHtml +=  "</div></div></li>";

            jList.append(sHtml);
        }

        function checkPermissions(sScope, fCallback) {
            if (sAccessToken == null) {
                sAccessToken = FB.getAccessToken();
            }
            if (sUserId == null) {
                sUserId = FB.getUserID();
            }
            FB.api('/me/permissions?access_token=' + sAccessToken, function(oResponse) {
                if (oResponse.data && oResponse.data[0]) {
                    var bCondition = true;

                    //check if every scope is included in the granted permissions
                    var aScopes = sScope.split(',');
                    for (var i = 0; i < aScopes.length; i++) {
                        bCondition = (oResponse.data[0][aScopes[i]] !== undefined);
                        if (!bCondition) {
                            break;
                        }
                    }

                    //there's only a single permission required per share type,
                    //so no further analysis on this
                    return fCallback(bCondition);
                }
            });
        }

        function getScope(iTaggedCount) {
            var sScope = 'publish_actions';
            if (oOptions.sMethod == 'stream.dm' || oOptions.sMethod == 'stream.fbdm') {
                sScope = 'xmpp_login';
            } else {
                if (oOptions.iTaggingLimit !== 0 && iTaggedCount > oOptions.iTaggingLimit) {
                    sScope += ',xmpp_login';
                }
            }

            return sScope;
        }

        function requestPermissions(iTaggedCount, fCallback) {
            var sScope = getScope(iTaggedCount);

            FB.login(function() {
                return checkPermissions(sScope, fCallback);
            }, {scope: sScope});
        }

        function toggleError(sMsg) {
            if (!sMsg || $.trim(sMsg) === '') {
                $('#dialogTagFBErrorMessage')
                    .html(sMsg || '')
                    .slideUp();
            } else {
                if ($('#dialogTagFBErrorMessage').html().length > 0) {
                    $('#dialogTagFBErrorMessage').slideUp(function() {
                        $('#dialogTagFBErrorMessage')
                            .html(sMsg)
                            .slideDown();
                    });
                } else {
                    $('#dialogTagFBErrorMessage')
                        .html(sMsg)
                        .slideDown();
                }
            }
        }


        function hasAvaazUrl() {
            if (!bCheckAvaazURLInFBMessage) {
                return true;
            }

            if ($('#dialogTagFBFriendsMessage').val().indexOf($('#dialogTagFBFriendsLink').text()) !== -1) {
                return true;
            }

            return false;
        }

        function hasExternalLink() {
            var sMessage = $('#dialogTagFBFriendsMessage').val();
            var aUrls = sMessage.match(/\b(http|https)?(:\/\/)?(\S*)\.(\w{2,4})\b/ig);
            var bExternalLink = false;
            for (var i=0, il=aUrls.length; i<il; i++) {
                if (!aUrls[i].match(/avaaz.org/)) {
                    bExternalLink = true;
                    break;
                }
            }
            return bExternalLink;
        }

        //shares the post on FB with tagging friends OR via DM (FB chat)
        function tagFriends() {
            var bPassed = true;
            var aTaggedFriends = [];


            $("input[name^='fbFriend']:checked").each(function() {
                aTaggedFriends.push($(this).data("fbid"));
            });

            if (aTaggedFriends.length === 0) {
                bPassed = false;
                toggleError(oFbMessageBlurbs.noFriendsSelected || 'Error: no friends selected');
                $.fn.sendGAEventFbdm("FBDM", "DM Error", 'No friends selected'); //GA tracking error showing
                bProcessingPost = false;
            } else if ($.trim($('#dialogTagFBFriendsMessage').val()) === '') {
                bPassed = false;
                toggleError(oFbMessageBlurbs.noMessageEntered || 'Error: no message entered');
                $.fn.sendGAEventFbdm("FBDM", "DM Error", 'No message entered'); //GA tracking error showing
                $.fn.sendOptimizelyEvent('do_dm_message_error');
                bProcessingPost = false;
            } else if (!hasAvaazUrl()) {
                bPassed = false;
                bProcessingPost = false;
                toggleError(oFbMessageBlurbs.noLinkInTheMessage || 'Error: no Avaaz link');
                $('#copyLinkWrapper').effect("pulsate", {times:2}, 1000);
                $.fn.sendGAEventFbdm("FBDM", "DM Error", 'No link in the message'); //GA tracking error showing
                showCopyLinkTool(false);
            } else if (hasExternalLink()) {
                bPassed = false;
                bProcessingPost = false;
                toggleError(oFbMessageBlurbs.noAvaazLink || 'Error: no Avaaz link');
                $.fn.sendGAEventFbdm("FBDM", "DM Error", 'External link in the message'); //GA tracking error showing
                showCopyLinkTool(false);
            } else if (oOptions.iTaggingLimit > 0) {
                if (oOptions.iDmLimit > 0 && aTaggedFriends.length - oOptions.iTaggingLimit > oOptions.iDmLimit) {
                    bPassed = false;
                    toggleError(oFbMessageBlurbs.maxFriendsExceeded || 'Error: maximum friends to DM exceeded');
                    $.fn.sendGAEventFbdm("FBDM", "DM Error", 'Too many friends selected'); //GA tracking error showing
                    bProcessingPost = false;
                }
            }

            if (bPassed) {
                //request extended permissions
                requestPermissions(aTaggedFriends.length, function(bHasPermissions) {
                    if (bHasPermissions) {
                        toggleError();
                        toggleSendingButton();
                        if (oOptions.sMethod == 'stream.dm' || oOptions.sMethod == 'stream.fbdm') {
                            postAsDirectMessage(aTaggedFriends, postCallback);
                        } else if (oOptions.sMethod == 'stream.taggingdm') {
                            postCombined(aTaggedFriends, postCallback);
                        }
                    } else {
                        var sDefaultMessage = "Avaaz needs permission to send this to your friends.";
                        if (oOptions.sMethod == 'stream.dm' || oOptions.sMethod == 'stream.fbdm') {
                            msg = oFbMessageBlurbs.noDmPermissions || sDefaultMessage;
                        } else {
                            msg = oFbMessageBlurbs.noTaggingDMPermissions || sDefaultMessage;
                        }
                        toggleError(msg);
                        $.fn.sendGAEventFbdm("FBDM", "DM Error", 'Needs permission'); //GA tracking error showing
                        bProcessingPost = false;
                    }
                });
            }
        }

        function postToWall(aFriends, bSignAndShareTracking, fCallback) {
            var oParams = {
                message: jMessage.val(),
                name: jTitle.html(),
                picture: $('meta[property="og:image"]').attr('content'),
                description: jDescription.html(),
                link: jLink.html()
            };
            var firstParameterType = typeof aFriends;
            switch (firstParameterType) {

                //triggered by closing the widget without sharing when using tag+dm
                case 'boolean':
                    fCallback = bSignAndShareTracking;
                    bSignAndShareTracking = aFriends;
                    if (bSignAndShareTracking) {
                        oParams.link = jLink.html()
                            .replace(/\?fbdm/, '?fbss')
                            .replace(/\?d/, '?s');
                    }
                    break;

                //triggered by tagging friends
                case 'object':
                    fCallback = bSignAndShareTracking;
                    var aMentions = [];
                    for (var i = 0; i < aFriends.length; i++) {
                        aMentions.push('@[' + aFriends[i] + ']');
                    }
                    oParams.message += " " + aMentions.join(', ');
                    oParams.campaign = $('meta[property="og:url"]').attr('content');
                    break;
            }
            if (firstParameterType != 'object') {
                FB.api('me/feed?access_token=' + sAccessToken, 'post', oParams, function(oResponse) {
                    fCallback(oResponse);
                });
            } else {
                FB.api('me/avaazorg:sign?access_token=' + sAccessToken, 'post', oParams, function(oResponse) {
                    fCallback(oResponse);
                });
            }

        }

        function postAsTag(aFriends, fCallback) {
            postToWall(aFriends, fCallback);
        }

        function postAsDirectMessage(aFriends, fCallback) {
            var sMessage = jMessage.val();

            $.ajax({
                url:'/act/ajax_fb_send_dm.php',
                dataType: 'json',
                type: 'POST',
                data: {
                    message: sMessage,
                    friends: aFriends,
                    token: sAccessToken,
                    userId: sUserId,
                    cid: self.cid,
                    pid: oOptions.iPid || 0
                },
                success: function(oResponse) {
                    fCallback(oResponse);
                },
                error: function(oError) {
                    fCallback(oError);
                }
            });
        }

        function postCombined(aFriends, fCallback) {
            var iTaggingLimit = oOptions.iTaggingLimit;

            if (aFriends.length <= iTaggingLimit || iTaggingLimit === 0) {
                postAsTag(aFriends, fCallback);
            } else {
                postAsTag(aFriends.slice(0, iTaggingLimit), function(oResponse) {
                    if (oResponse && !oResponse.error) {
                        postAsDirectMessage(aFriends.slice(iTaggingLimit), fCallback);
                    } else {
                        fCallback(oResponse);
                    }
                });
            }
        }

        function prepareToSendMoreMessages() {

            //closing the popup on 2nd time messages was sent
            window.bMustClosePopupNextTime = true;

            //done sending link activation
            $('#dialogTagFBFriendsDoneSending').css('display', 'block');
            $.colorbox.resize();

            //send more messages title and text of popup
            $('#dialogTagFBFriendsHeaderTitle').html('<img src="/new/images/do_blue/green_check_med.png" alt="" />' + oFbMessageBlurbs.messageTitleSuccess);
            $('#dialogTagFBFriendsHeaderMessage').html(oFbMessageBlurbs.messageSendAnother);

            //flagging selected (messaged) users container as signed, unselected, not hoverable,
            //message sent, and placed in the bottom of the friends list - also removing checkbox itself
            $('.fb-friends-list input:checked').each(function (){
                $(this).parent().addClass('user-signed');
                $(this).parent().parent().removeClass('selected');
                $(this).parent().parent().removeClass('hoverable');
                $(this).parent().parent().children('div').children('em').html(oFbMessageBlurbs.messageSent);
                $(this).parent().parent().parent().data('order', '2');
                $(this).remove();
            });

            //changing order and removing suggested flag from all old suggested friends, if any
            $('.fb-friends-list input[suggested="1"]').each(function (){
                $(this).removeAttr('suggested');
                $(this).parent().parent().parent().data('order', '1');
            });

            if (bSuggestedFeatureEnabled) {
                //getting more random users
                var oRandomNewSuggestedFriendsArray = $('.fb-friends-list input').get().sort(function (){
                    return Math.round(Math.random())-0.5
                }).slice(0,iNumberOfSuggestedFriends);

                //flagging new 20 random members as suggested
                $(oRandomNewSuggestedFriendsArray).attr('suggested', '1');
                $(oRandomNewSuggestedFriendsArray).each(function (){
                    $(this).parent().parent().parent().data('order', '0');
                });

                //updating suggested counter
                $('#counter-suggested-friends').html($('.fb-friends-list input[suggested="1"]').length);

                //selecting the new suggested
                $('#dialogTagFBSelectorSuggested').trigger('click');

                //client side reordering
                var oFriendsListElements = $('.fb-friends-list li');
                oFriendsListElements.sort(function(a, b) {
                    var chA = $(a).data('order');
                    var chB = $(b).data('order');
                    if (chA < chB) return -1;
                    if (chA > chB) return 1;
                    return 0;
                });
                var oFriendsList = $('.fb-friends-list');
                $(oFriendsList).append(oFriendsListElements);
            }

            //cleaning search content
            jSearch.val('');
            jSearch.trigger('keyup');
        }

        function postCallback(oResponse) {
            toggleSendingButton();
            bFinishedSharing = true;
            if (oResponse && !oResponse.error) {
                $.fn.sendGAEventFbdm("FBDM", "DM Shared", "Friends: " + window.selectedFriendsCounter); //GA tracking successful shared

                if (!window.bMustClosePopupNextTime)  {
                    prepareToSendMoreMessages();
                } else {
                    self.close();
                }

            } else {
                toggleError(oResponse ? (oResponse.error.message || oResponse.error) : 'Error: no data');
                if (!oResponse) {
                    $.fn.sendGAEventFbdm("FBDM", "DM Error", oResponse ? (oResponse.error.message || oResponse.error) : 'No data in post callback'); //GA tracking error showing
                }
            }
            bProcessingPost = false;
        }

        function toggleSendingButton() {
            var currentButtonWidth = jButton.innerWidth();
            jButton.toggleClass('sending');
            if (jButton.hasClass('sending')) {
                jButton.find('.button_td1').html((oFbMessageBlurbs.sendingButtonText || 'Sending')+ '<b class="periods">...</b>');
                if (document.all && document.querySelector && !document.addEventListener) {   //recognition ie8
                    jButton.find('.button_td1').width(currentButtonWidth - 54 );
                } else {
                    jButton.width(currentButtonWidth - 40);
                }
                oRunPeriodsTimer = setInterval(animatePeriods, 800);

            } else {
                jButton.find('.button_td1').html(oFbMessageBlurbs.buttonContent);
                if (document.all && document.querySelector && !document.addEventListener) {   //recognition ie8
                    jButton.find('.button_td1').width("auto");
                } else {
                    jButton.width("auto");
                }

                clearInterval(oRunPeriodsTimer);
            }
        }

        function animatePeriods() {
            var jPeriods = jButton.find('.periods');
            var sText = jPeriods.html();
            jPeriods.html((sText !== null && sText.length < 3) ? sText + '.' : '');
        }

        function insertUserBirthDateField() {
            var url = '/act/facebook_data.php?action=userBirthDate';
            $.getJSON(url, function(oResponse) {
                if (oResponse && !oResponse.error && typeof(oResponse[0]) != "undefined" && "birthday_date" in oResponse[0]) {
                    if (oResponse[0].birthday_date != null && oResponse[0].birthday_date.match(/^(0\d|1[012])\/(0\d|1\d|2\d|3[01])\/(19|20)\d\d$/)) {
                        var userBirthDate = oResponse[0].birthday_date;

                        //sign and signajax form DoB fields append
                        bSomeSignFormExists = ($('#petition-form').length != 0 || $('#simple-petition-form').length != 0);
                        if (bSomeSignFormExists) {

                            oSignFormId = ($('#petition-form').length == 1) ? $('#petition-form') : $('#simple-petition-form');

                            $('<input>').attr({
                                type: 'hidden',
                                name: 'DoB[day]',
                                value: userBirthDate.substr(3,2)
                            }).appendTo(oSignFormId);

                            $('<input>').attr({
                                type: 'hidden',
                                name: 'DoB[month]',
                                value: userBirthDate.substr(0,2)
                            }).appendTo(oSignFormId);

                            $('<input>').attr({
                                type: 'hidden',
                                name: 'DoB[year]',
                                value: userBirthDate.substr(6,4)
                            }).appendTo(oSignFormId);
                        }
                    }
                }
            });
        }

        function updateUserBirthDateField() {
            var url = '/act/facebook_data.php?action=userBirthDate';
            $.getJSON(url, function(oResponse) {
                if (oResponse && !oResponse.error && oResponse[0].birthday_date != null) {
                    if (oResponse[0].birthday_date.match(/^(0\d|1[012])\/(0\d|1\d|2\d|3[01])\/(19|20)\d\d$/)) {
                        //updating member DoB on database
                        $.ajax({
                            url: "/act/ajax_update_dob.php?uhash=" + getHashFromUrl() + '&DoB=' +  oResponse[0].birthday_date + '&userHashCheck=' + window.userHashCheck
                        });
                    }
                }
            });
        }

        function getHashFromUrl() {
            var aUrlParams = window.location.search.replace('?', '').split('&');
            var sEntry = '';
            for (i in aUrlParams) {
                sEntry = aUrlParams[i];
                if (sEntry.indexOf('=') == -1 && !/^\d+$/.test(sEntry) && sEntry.length >= 6) {
                    return sEntry.substring(1);
                }
            }
            return false;
        }

        $.fn.fbdmFillContactsTable = function() {
            FB.api({
                        method: 'fql.query',
                        query: '    SELECT uid, name, pic_square, is_app_user \
                                    FROM user \
                                    WHERE uid IN \
                                    ( \
                                        SELECT uid, name \
                                        FROM user \
                                        WHERE uid IN \
                                        ( \
                                            SELECT uid2 FROM friend WHERE uid1 = me() \
                                        ) \
                                        ORDER BY name ASC \
                                    ) \
                                    ORDER BY is_app_user \
                                    LIMIT ' + window.iFriendListOffset + ', ' + iFriendsChunkLoadSize,
                        access_token: sAccessToken
                    }, function(oResponse) {

                            if (oResponse.length > 0 && !oResponse.error) {

                               //save user friends
                                $.ajax({
                                    url: '/act/facebook_data.php?action=saveFriends',
                                    dataType: 'json',
                                    type: 'POST',
                                    data: {facebook_id: FB.getUserID(), friends: oResponse}
                                });

                                for (var i = 0; i < oResponse.length; i++) {
                                    var oItem = oResponse[i];
                                    if (oItem.uid && oItem.name) {
                                        addFriendRow(oItem);
                                        window.iLoadedFriends++;
                                    }
                                }

                                //updating all counter
                                $('#counter-all-friends').html(window.iLoadedFriends);

                                var checkBoxChange = function(e) {
                                    if (e.currentTarget.checked) {
                                        $(this).parent().parent().addClass('selected');
                                    } else {
                                        $(this).parent().parent().removeClass('selected');
                                    }

                                    //main control for Google Analytics friends selection tracker
                                    window.selectedFriendsCounter = $('.fb-friends-list input:checked', self).length;

                                    $.fn.selectFriendsCounter();

                                    //updation button "Send X Messages"
                                    if(window.selectedFriendsCounter != 0) {
                                        var selectedFriendsCounterLength = (window.selectedFriendsCounter + ' ').length;
                                        $('#counter-selected-friends').css({ width: selectedFriendsCounterLength * 10 + 'px' });
                                    } else {
                                        $('#counter-selected-friends').css({ width: '0px' });
                                    }

                                    //none selector coherence
                                    if (window.selectedFriendsCounter == 0) {
                                        $('#dialogTagFBSelectorNone').addClass('active');
                                    } else {
                                        $('#dialogTagFBSelectorNone').removeClass('active');
                                    }

                                    //all selector coherence
                                    if (window.selectedFriendsCounter == window.iLoadedFriends) {
                                        $('#dialogTagFBSelectorAll').addClass('active');
                                    } else {
                                        $('#dialogTagFBSelectorAll').removeClass('active');
                                    }

                                    $('#counter-selected-friends').html((window.selectedFriendsCounter != 0 ? window.selectedFriendsCounter + ' ' : ''));

                                    checkSendButtonEnabling();
                                    e.stopPropagation();
                                };

                                $("input[name='fbFriendOffset" + window.iFriendListOffset + "']").click(checkBoxChange);
                                $("input[name='fbFriendOffset" + window.iFriendListOffset + "']").bind('checkBoxChange', checkBoxChange);

                                //making li inner friend box clickable
                                $("input[name='fbFriendOffset" + window.iFriendListOffset + "']").closest('.fb-friends-list-item').bind('click', function() {
                                    var oChildCheckbox = $(this).find(":checkbox");
                                    oChildCheckbox.prop('checked', !oChildCheckbox.prop('checked')).trigger('checkBoxChange');
                                });

                                if (window.iFriendListOffset == 0) {

                                    //updating suggested counter
                                    $('#counter-suggested-friends').html($('.fb-friends-list input[suggested="1"]').length);

                                    $('#' + sPopupId + 'Loading').hide();
                                    $('#' + sPopupId + 'Selectors').slideDown();

                                    if (bSuggestedFeatureEnabled) {
                                        $('#dialogTagFBSelectorSuggested').show();
                                        $('#dialogTagFBSelectorSuggested').trigger('click'); //autoselecting suggested friends
                                    }
                                }

                                if (window.iLoadedFriends < window.iFriendsCounter) {
                                    window.iFriendListOffset += iFriendsChunkLoadSize;
                                    $.fn.fbdmFillContactsTable();
                                }
                            }
                    });
        }

        //loads the user's contacts
        function loadContactsTable(bReloadContacts) {
            if (typeof(window.iLoadedFriends) == "undefined" || window.iLoadedFriends == 0 || bReloadContacts) {
                jList.empty();

                $('#' + sPopupId + 'Loading').show();

                window.iFriendListOffset = 0;
                window.iLoadedFriends = 0;

                $.fn.fbdmFillContactsTable();
            }
        }

        function getPictureHTML(oItem) {
            var sHtml = '<td class="fb-user-img">';
            if (oItem.pic_square) {
                sHtml += "<img id='pic_" + oItem.uid + "' src='" + oItem.pic_square + "' height='35' width='35' alt='" + oItem.name + "' />\n";
            } else {
                sHtml += "<span class='fbFriendBlock'></span>\n";
            }
            sHtml += "</td>";

            return sHtml;
        }

        function getPlaceHolderHTML() {
            return '<li class="friend-placeholder"></li>';
        }

        function registerGlobalCallbacks() {
            //register global fb callback handler
            if (!window.fbCallback) {
                window.fbCallback = function(oParams) {
                    for (var sCallbackName in window.aFbCallbackStack) {
                        window.aFbCallbackStack[sCallbackName](oParams);
                    }
                };
            }
            if (!window.aFbCallbackStack) {
                window.aFbCallbackStack = [];
            }
            if (!window.aFbCallbackStack.taggingCallback) {
                window.aFbCallbackStack.taggingCallback = function(oParams) {
                    if (oParams) {
                        sAccessToken = oParams.accessToken;
                        sUserId = oParams.userID;
                        bIsLoggedIn = true;
                        $.fn.sendGAEventFbdm("FBDM", "DM Load", tracking['lang']);

                        //updating DoB if on PA and inserting if signing campaign
                        if ($('#postaction_container').length == 1) {
                            updateUserBirthDateField();
                        } else {
                            insertUserBirthDateField();
                        }

                        self.show();
                    }
                };
            }
            bInitialized = true;
        }

        function getMaxFriendsCount() {
            if (oOptions.sMethod === 'stream.dm' || oOptions.sMethod === 'stream.fbdm') {
                return oOptions.iDmLimit;
            } else { //stream.taggingdm
                var iMax = oOptions.iTaggingLimit > 0 && oOptions.iDmLimit > 0 ? oOptions.iTaggingLimit + oOptions.iDmLimit : 0;
                return iMax;
            }
        }

        return this;
    };

    $(document).facebookReady(function(){
        $(document).ready(function(){
            FB.getLoginStatus(function (response) {
                if (response.status == 'connected') {
                    FB.api('/me/permissions', function (response) {
                        if (response.data && response.data[0] && response.data[0].user_friends) {
                            window.bFbFriendsPermissionGranted = true;
                            window.bFbdmProcessFirstCall = true;
                            if (!window.oFBTagWidget) {
                                var options = {sMethod: sFbMethod};
                                window.oFBTagWidget = $('div#dialogTagFBFriends').FBTagFriendsWidget(options);
                            }
                            window.oFBTagWidget.process();
                        }
                    });
                }
            });
        });
    });

})(jQuery);

if (!cid) {
    var cid = tracking.cid;
}

(function (d) {
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {
        return;
    }
    js = d.createElement('script');
    js.id = id;
    js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    ref.parentNode.insertBefore(js, ref);
}(document));

$(document).ready(function () {
    var sLink = $('#dialogTagFBFriendsLink').html();
    sLink = sLink.replace(new RegExp('&amp;', 'g'), '&');

    //Get link before query string
    var aTemp = sLink.split('?');
    var sShortLink = aTemp[0];

    // Use PA page hash
    var sHash = getUserHash(),
        hash_no_prefix = getUserHash(true),
        hash_prefix = sHash ? sHash.substring(0, sHash.length - 6) : null;
    if ('a' === hash_prefix) {
        sLink = sShortLink + '?d' + hash_no_prefix;
        $('#dialogTagFBFriendsLink').html(sLink);
    } else {
        sLink = sLink.replace('rc=fb&', 'rc=fbdm&');
        $('#dialogTagFBFriendsLink').html(sLink);
    }

    //Update suggestedMessageText with user hash
    var oSuggested = $('#suggestedMessageText');
    var sSuggestedText = oSuggested.data('text');

    if (oSuggested.length > 0 && sShortLink != '') {
        if (sSuggestedText.indexOf(sShortLink) > -1) {
            sSuggestedText = sSuggestedText.substr(0, sSuggestedText.indexOf(sShortLink));
            oSuggested.data('text', sSuggestedText + sLink);
        }
    }
    // Update suggestedMessageText with campaign url
    if (typeof tracking['petition-id'] === 'undefined') {
        oSuggested.data('text', sSuggestedText + "\n" + sLink);
        oSuggested.text(oSuggested.data('text'));
    }

    //$('#dialogTagFBFriendsPicture').attr('src', (share_data[tracking['cid']]['facebook']['media'][0]['src']).replace(/https?:/, document.location.protocol));

    // check for fbdm hash to include the input hidden for conversions
    var aUrlParams = window.location.search.replace('?', '').split('&');
    for (i in aUrlParams) {
        if (aUrlParams[i] == 'fbdm') {
            $('form').each(function () {
                if (!($(this).find('[name="hash"]')[0])) {
                    $(this).append('<input type="hidden" name="hash" value="fbdm"/>');
                }
            });
        }
    }

    $('#suggestedMessageButton').on('click', function () {
        $('#dialogTagFBShareMessageContainer label').hide();
        $('#suggestedMessageWrapper').slideUp();
        $('#dialogTagFBFriendsMessage').val($('#suggestedMessageText').data('text')).trigger('change').focus().select();
        $('#copyLinkWrapper').hide();
        $('.message-bar .message-bar-column').eq(0).width(0);
        $('.message-bar .message-bar-column').eq(1).width('100%');
        $.colorbox.resize();
    });

    $('#copyLinkButton').on('click', function () {
        $('#dialogTagFBFriendsMessage').val($('#dialogTagFBFriendsMessage').val() + "\n" + $('#dialogTagFBFriendsLink').text()).trigger('change').focus().select();
        $('#copyLinkWrapper').slideUp();
        $.colorbox.resize();
    });

    $(window).resize(function() {
        var win_w = $(window).width();

        if ( $('#dialogTagFBFriends').is(':visible') ) {
            if( win_w < 480 ) {
                $.colorbox.resize({
                    width : '300px'
                });
            } else if ( win_w >= 480 && win_w < 768 ) {
                $.colorbox.resize({
                    width : '460px'
                });
            } else if ( win_w >= 768 && win_w < 1200 ) {
                $.colorbox.resize({
                    width : '660px'
                });
            } else {
                $.colorbox.resize({
                    width : '900px'
                });
            }
        }
    });
});

