ThePoint.FacebookConnect = function () {
  var userAttrs = ['first_name', 'last_name', 'current_location', 'hometown_location', 'about_me', 'email_hashes', 'timezone', 'proxied_email'];
  var apiKey = ThePoint.facebookApiKey;
  var apiClient;
  var feedData;

  return {
    init: function() {
      if (!ThePoint.facebookApiKey) return;
      apiKey = ThePoint.facebookApiKey;

      FB_RequireFeatures(["XFBML"], function() {
        FB.Facebook.init(ThePoint.facebookApiKey, "/facebook/xd_receiver.html", {
                                                                                 ifUserConnected: ThePoint.FacebookConnect.connectedUserHandler,
                                                                                 ifUserNotConnected: ThePoint.FacebookConnect.unconnectedUserHandler
                                                                                });

        FB.Facebook.get_sessionState().waitUntilReady(function() {
          apiClient = FB.Facebook.apiClient;
                });
          });
      }.memoize(),

        connectedUserHandler: function() {
          if(!ThePoint.Application.isConnectedWithFacebook()) {
              ThePoint.FacebookConnect.onConnect(); 
          }
        }.memoize(),

        unconnectedUserHandler: function() {
          if(ThePoint.Application.isConnectedWithFacebook()) {
              FB.Connect.requireSession(null, function() {
                 ThePoint.Application.logOut();
              });
          }
        }.memoize(),
        
        promptPermissionHandler: function() {
          new Ajax.Request(("/users/current_user/identities/" + $F('identity_id')), { method: 'put', evalScripts: true, parameters: 'identity[allow_email]=true' });
        },

    getApiClient: function() {
      return apiClient;
    },
    
    getApiKey: function() {
      return apiKey;
    },
    
    getCurrentUid: function() {
      
            try {
                return apiClient.get_session().uid;
            } catch(e) {
                return null;
            }
    }.memoize(),

    normalizeUserInfo: function(fbUserInfo) {
    if (!fbUserInfo['current_location']) {
        return {
          hashes:     $A(fbUserInfo['email_hashes']).join(","),
          first_name: fbUserInfo['first_name'],
          last_name:  fbUserInfo['last_name'],
          about_me:   fbUserInfo['about_me'],
          timezone:   fbUserInfo['timezone']
          };      
    } else {
        return {
          hashes:     $A(fbUserInfo['email_hashes']).join(","),
          city:       fbUserInfo['current_location']['city'] || fbUserInfo['hometown_location']['city'],
          state:      fbUserInfo['current_location']['state'] || fbUserInfo['hometown_location']['state'],
          country:    fbUserInfo['current_location']['country'] || fbUserInfo['hometown_location']['country'],
          first_name: fbUserInfo['first_name'],
          last_name:  fbUserInfo['last_name'],
          about_me:   fbUserInfo['about_me'],
          timezone:   fbUserInfo['timezone']
          };      
    }
    },

    onConnect: function() {
      var uid = ThePoint.FacebookConnect.getCurrentUid();
      
      var allow_email = FB.Facebook.apiClient.users_hasAppPermission('email', ThePoint.FacebookConnect.promptPermissionHandler);

      FB.Facebook.apiClient.users_getInfo(uid, userAttrs, function(res, ex) {
      
        user = ThePoint.FacebookConnect.normalizeUserInfo(res[0]);
          
        var form = new Element('form', {
                                          action: "/session",
                                          method: "post"
                                        });

        $$('body').each(function(e){e.appendChild(form)});
        
        form.insert(new Element('input', {type: 'hidden', name: 'fb[uid]', value: uid}));

        if (user['hashes'].length > 0) {
              form.insert(new Element('input', {type: 'hidden', name: 'fb[email_hashes]', value: user['hashes']}));
        }

        form.insert(new Element('input', {type: 'hidden', name: 'fb[first_name]', value: user['first_name']}));
        form.insert(new Element('input', {type: 'hidden', name: 'fb[last_name]', value: user['last_name']}));
        form.insert(new Element('input', {type: 'hidden', name: 'fb[about_me]', value: user['about_me']}));
        form.insert(new Element('input', {type: 'hidden', name: 'fb[timezone]', value: user['timezone']}));
        form.insert(new Element('input', {type: 'hidden', name: 'fb[city]', value: user['city']}));
        form.insert(new Element('input', {type: 'hidden', name: 'fb[state]', value: user['state']}));
        form.insert(new Element('input', {type: 'hidden', name: 'fb[country]', value: user['country']}));
        form.insert(new Element('input', {type: 'hidden', name: 'fb[proxied_email_address]', value: user['proxied_email']}));
        form.insert(new Element('input', {type: 'hidden', name: 'fb[allow_email]', value: allow_email}));

        form.submit();

        });
    }.memoize(),
    
    onDisconnect: function() {
      // disconnect from facebook
    },
    
    hasEmailPermission: function(successCallback, failureCallback) {
      FB.Facebook.apiClient.users_hasAppPermission('email',
        function(result) {
          if (result == 0) {
            successCallback();
          } 
          else {
            failureCallback();
          }
        }
      );
    },
    promptPermission: function() {
      
      function facebook_prompt_permission(permission, callbackFunc) {
        //check is user already granted for this permission or not
        ThePoint.FacebookConnect.hasEmailPermission(
          function(){FB.Connect.showPermissionDialog(permission, callbackFunc);}, 
          function(){callbackFunc(true);}
        );
      }

      // this checks current status of permission and if not granted it will display an ajax box for user to give permission.
      facebook_prompt_permission('email', function(accepted) {
        // alert("ACCEPTED:" + accepted);
        // alert("TYPE: " + typeof(accepted));
        if(typeof(accepted) == 'string' && accepted == "") {
          // alert("clicked NO");
        }        
        else if(accepted == false) {
          // alert("clicked X on box");
        }
        else if(accepted) {
          ThePoint.FacebookConnect.promptPermissionHandler();
        }
        else {
          alert('failure');
        }
          
      });
    }
  
  };
}();

document.observe("dom:loaded", function() {
  ThePoint.FacebookConnect.init();
    if(ThePoint.Application.isConnectedWithFacebook()) {
        Event.addBehavior({
          'a[href="/logout"]' : Behavior.create({
            onclick : function(e) {
              e.stop();
              FB.Connect.logoutAndRedirect('/logout');
            }
          })
        });
        
        if(ThePoint.FacebookConnect.feedData) {
          FB.Connect.showFeedDialog(ThePoint.Application.facebookTemplateBundleId, ThePoint.FacebookConnect.feedData);
        }
        
    }
});
