/*************************************************************
Damien Benier for iShopYouShop.com
*************************************************************/

Event.observe(document, 'dom:loaded', initializeFacebook, false);

var MyFacebook = {};

MyFacebook.users = {};
MyFacebook.uidsToLoad = new Array();
MyFacebook.onLoadedCallbacks = {};
MyFacebook.defaultOnLoadedCallback = null;
MyFacebook.onPublishFeedStoryCallback = null;

MyFacebook.init = function(apiKey, xdReceiverUrl)
{
  FB.init(apiKey, xdReceiverUrl);
}

MyFacebook.publishFeedStory = function(formBundleId, templateData, introductionText, options)
{
  MyLogger.log('Facebook publishFeedStory (' + formBundleId + ')');
  
  options = Object.extend({onCloseCallback:this.defaultOnLoadedCallback, promptConnect:false}, options);

  var target = templateData.target ? templateData.target : null;
  var _this = this;
  
  FB.ensureInit(function()
  {
    var onCloseProxyCallback = null;
    
    if (_this.onPublishFeedStoryCallback)
    {
      _this.onPublishFeedStoryCallback(true);
      onCloseProxyCallback = function(){ _this.onPublishFeedStoryCallback(false); if (options.onCloseCallback) options.onCloseCallback(); };
    }
    else onCloseProxyCallback = options.onCloseCallback;
    
    FB.Connect.showFeedDialog(formBundleId, templateData, target, '', null, options.promptConnect ? FB.RequireConnect.promptConnect : FB.RequireConnect.doNotRequire, onCloseProxyCallback, introductionText);
  });
}

MyFacebook.setPublishFeedStoryCallback = function(onPublishFeedStoryCallback)
{
  this.onPublishFeedStoryCallback = onPublishFeedStoryCallback;
}

MyFacebook.setDefaultOnLoadedCallback = function(onLoadedCallback)
{
  this.defaultOnLoadedCallback = onLoadedCallback;
}

MyFacebook.pushUser = function(uid, memberId, options)
{
  MyLogger.log('pushing facebook user (uid=' + uid + ' memberId=' + memberId + ')');
  
  options = Object.extend({callback:this.defaultOnLoadedCallback, load:false}, options);
  
  if (!this.users[uid]) this.users[uid] = {uid:uid, memberId:memberId, imageUrl:null, loaded:false};
  
  if (this.users[uid].loaded) options.callback(this.users[uid]);
  else
  {
    this.uidsToLoad.push(uid);
    if (!this.onLoadedCallbacks[uid]) this.onLoadedCallbacks[uid] = new Array();
    this.onLoadedCallbacks[uid].push(options.callback);
  }
  
  if (options.load) this.loadUsers();
}

MyFacebook.loadUsers = function()
{
  if (this.uidsToLoad.length)
  {
    var query = 'SELECT uid,first_name,last_name,pic,profile_url FROM user WHERE uid IN (' + this.uidsToLoad.uniq().join(',') + ')';
    MyLogger.log('MyFacebook.loadUsers: ' + query);
    FB.ensureInit(function()
    {
      FB.Facebook.apiClient.fql_query(query, MyFacebook.onUsersQueryAnswer);
    });
  }
}

MyFacebook.callOnLoadedCallbacks = function(fbUser)
{
  var uid = fbUser.uid;
  var _this = this;
  
  this.users[uid].imageUrl = fbUser.pic;
  this.users[uid].firstName = fbUser.first_name;
  this.users[uid].lastName = fbUser.last_name;
  this.users[uid].profileUrl = fbUser.profile_url;
  this.users[uid].loaded = true;
  this.uidsToLoad = this.uidsToLoad.without(uid);
  
  if (this.onLoadedCallbacks[uid]) this.onLoadedCallbacks[uid].each(function(callback){ callback(_this.users[uid]); });
  
  delete this.onLoadedCallbacks[uid];
}

MyFacebook.onUsersQueryAnswer = function(result, error)
{
  if (error) MyLogger.log('Facebook onUsersQueryAnswer ERROR: ' + error);
  else result.each(function(fbUser){ MyFacebook.callOnLoadedCallbacks(fbUser) } );
}

MyFacebook.isConnected = function()
{
  return (FB.Facebook.apiClient.get_session().uid > 0);
}

MyFacebook.callOnConnexion = function(callback)
{
  FB.ensureInit(function()
  {
    FB.Connect.get_status().waitUntilReady(function(status)
    {
      if (status != FB.ConnectState.userNotLoggedIn)
      {
        callback(FB.Facebook.apiClient.get_session().uid);
      }
    })
  });
}


/*-----------------------------------------------------------------------------------------------*/



function updateMemberPolaroid(user)
{
  var elts = document.getElementsByClassName('member-image-' + user.memberId);
  
  for (var i = 0; i < elts.length; i++)
  {
    new ImagePreview(user.imageUrl, {div:elts[i].up()});
  }
}

function publishFeedStoryCallback(isShowing)
{
  $('lightbox').style.visibility = isShowing ? 'hidden' : 'visible';
}

MyFacebook.setDefaultOnLoadedCallback(updateMemberPolaroid);
MyFacebook.setPublishFeedStoryCallback(publishFeedStoryCallback);
  
function initializeFacebook()
{
  MyLogger.log('initializing Facebook');
  MyFacebook.init(facebookApiKey, facebookXdReceiverUrl);
  MyFacebook.loadUsers();
  
}

