/**
* @file
*
* Javascript specific to facebook connect pages. This means pages
* which are not canvas pages, and where fb_connect.module has
* initialized the facebook api. The user may or may not have
* authorized the app, this javascript will still be loaded.
*
* Note (!) much of the work done here is deprecated, and moved to fb.js
* (where code works equally well on both connect pages and canvas
* pages). If your app needs the features here, please report your
* use case to our issue queue (http://drupal.org/project/issues/fb),
* otherwise these features may go away...
*/
Drupal.behaviors.fb_connect = function(context) {
// Logout of facebook when logging out of drupal.
jQuery("a[href^='" + Drupal.settings.basePath + "logout']", context).click(FB_Connect.logoutHandler);
// Support markup for dialog boxes.
FB_Connect.enablePopups(context);
var events = jQuery(document).data('events');
if (!events || !events.fb_session_change) {
jQuery(document).bind('fb_session_change', FB_Connect.sessionChangeHandler);
}
};
FB_Connect = function(){};
// JQuery pseudo-event handler.
FB_Connect.sessionChangeHandler = function(context, status) {
jQuery('.block-fb_connect')
.ajaxStart(function() {
jQuery(this).html('
');
})
.ajaxStop(function() {
jQuery(this).html('');
})
;
// Call the default handler, too.
FB_JS.sessionChangeHandler(context, status);
};
// click handler
FB_Connect.logoutHandler = function(event) {
if (typeof(FB) != 'undefined') {
FB.logout(function () {
// Logged out of facebook. Need we act on this?
});
// Facebook's invalid cookies persist if third-party cookies disabled.
// Let's try to clean up the mess.
FB_JS.deleteCookie('fbs_' + FB._apiKey, '/', ''); // app id
FB_JS.deleteCookie('fbs_' + Drupal.settings.fb.apikey, '/', ''); // apikey
}
if (FB.getSession()) {
// Facebook needs more time to log us out. (http://drupal.org/node/1164048)
Drupal.settings.fb.reload_url = Drupal.settings.fb_connect.front_url;
return false;
}
};
/**
* Move new dialogs to visible part of screen.
**/
FB_Connect.centerPopups = function() {
var scrollTop = $(window).scrollTop();
$('.fb_dialog:not(.fb_popup_centered)').each(function() {
var offset = $(this).offset();
if (offset.left == 0) {
// This is some facebook cruft that cannot be centered.
}
else if (offset.top < 0) {
// Not yet visible, don't center.
}
else if (offset.top < scrollTop) {
$(this).css('top', offset.top + scrollTop + 'px');
$(this).addClass('fb_popup_centered'); // Don't move this dialog again.
}
});
};
FB_Connect.enablePopups = function(context) {
// Support for easy fbml popup markup which degrades when javascript not enabled.
// Markup is subject to change. Currently...
//
$('.fb_fbml_popup:not(.fb_fbml_popup-processed)', context).addClass('fb_fbml_popup-processed').prev().each(
function() {
this.fbml_popup = $(this).next().html();
this.fbml_popup_width = parseInt($(this).next().attr('width'));
this.fbml_popup_height = parseInt($(this).next().attr('height'));
//console.log("stored fbml_popup markup: " + this.fbml_popup); // debug
$(this).next().remove(); // Remove FBML so facebook does not expand it.
})
// Handle clicks on the link element.
.bind('click',
function (e) {
var popup;
//console.log('Clicked! Will show ' + this.fbml_popup); // debug
// http://forum.developers.facebook.net/viewtopic.php?pid=243983
var size = FB.UIServer.Methods["fbml.dialog"].size;
if (this.fbml_popup_width) {
size.width=this.fbml_popup_width;
}
if (this.fbml_popup_height) {
size.height=this.fbml_popup_height;
}
FB.UIServer.Methods['fbml.dialog'].size = size;
// http://forum.developers.facebook.net/viewtopic.php?id=74743
var markup = this.fbml_popup;
if ($(this).attr('title')) {
markup = '' + $(this).attr('title') + '' + this.fbml_popup;
}
var dialog = {
method: 'fbml.dialog', // triple-secret undocumented feature.
display: 'dialog',
fbml: markup,
width: this.fbml_popup_width,
height: this.fbml_popup_height
};
var popup = FB.ui(dialog, function (response) {
console.log(response);
});
// Start a timer to keep popups centered.
// @TODO - avoid starting timer more than once.
window.setInterval(FB_Connect.centerPopups, 500);
e.preventDefault();
})
.parent().show();
};