/*
	Contains WSFB and WSFBUser
*/
/*----------------------------------------
	WSFBUser OBJECT
	(WeSeed Facebook Connect User)
	(c) 2009 PEAK6 
	Author: Nate Racklyeft 
	
	Version:	0.1
	
	Requires:	jQuery 1.3+
				Facebook Connect js API
				Strings object
				WSFB object
----------------------------------------*/

// Constructor
//  - userinfo : Object : FB API response from the users.getInfo method (http://wiki.developers.facebook.com/index.php/Users.getInfo)
//  * Note: the getInfo call returns an array. This function only accepts a single object 
var WSFBUser = function(info) {
	// store the info object
	this.info = info;
	
};
/*----------------------------------------
	WSFB OBJECT
	(WeSeed Facebook Connect Manager)
	(c) 2009 PEAK6 
	Author: Nate Racklyeft 
	
	Version:	0.4.2 - better failure when Facebook is blocked
	
	Requires:	jQuery 1.3+
				Facebook Connect js API
				Strings object
				WSFBUser object
----------------------------------------*/

var WSFB = function(delegate) {
	if(typeof FB == "undefined") {
		return false;
	}
	
	/******* Settings *******/
	this.apiKey = "cc5b1f4d1ab32f6fea530e5422364380";
	// The fields to retrieve from the Users.getInfo call. See: http://wiki.developers.facebook.com/index.php/Users.getInfo
	this.userInfoFields = [
		"first_name",
		"last_name",
		"birthday",
		"current_location",
		"pic_square_with_logo",
		"profile_url"
	];
	// The URL to our cross-domain communication channel
	this.xdChannelUrl = WeSeed.url()+"/fbconnect/xd_receiver.htm";
	this.URL = {
		"login":"/fbconnect/loginUser.html",
		"connectUser":"/fbconnect/connectUser.html",
		"disconnectUser":"/fbconnect/disconnectUser.html"
	};
	
	this.setDelegate(delegate);
	
	// Fire up the Connect instance
	FB.init(this.apiKey,this.xdChannelUrl,{
		"ifUserConnected":this.isConnected,
		"ifUserNotConnected":this.isNotConnected
	});
	
	WSFB.__instance = this;
	return WSFB.__instance;
};

WSFB.prototype = {
	// methods
	"getCurrentUser":function() {
		var wsfb = WSFB.getInstance();
	
		if(wsfb.currentUser === null) {
			wsfb.api = FB.Facebook.apiClient;
			FB.Facebook.apiClient.users_getInfo(wsfb.api.get_session().uid,wsfb.userInfoFields,wsfb.didSetCurrentUser);
		} else {
			if($.isFunction(wsfb.delegate.didSetCurrentUser)) {
				wsfb.delegate.didSetCurrentUser(wsfb.currentUser); 
			}
		}
	},
	"checkWSAccountStatus":function() {
		var wsfb = WSFB.getInstance();
		$.ajax({
			type:	"GET",
			url:	wsfb.URL.login,
			dataType: "json",
			error:	function() {
				if($.isFunction(wsfb.delegate.didNotFindWSAccount)) {
					wsfb.delegate.didNotFindWSAccount();
				}
			},
			success:function(data) {
				if(data.error) {
					if($.isFunction(wsfb.delegate.didNotFindWSAccount)) {
						wsfb.delegate.didNotFindWSAccount();
					}
				} else {
					if($.isFunction(wsfb.delegate.didFindWSAccount)) {
						wsfb.delegate.didFindWSAccount();
					}
				}
			}
		});
	},
	"connectAccount":function() {
		var wsfb = WSFB.getInstance();
		
		function connectUser() {
			$.ajax({
				type:	"GET",
				url:	wsfb.URL.connectUser,
				dataType: "json",
				error:	function() {
					if($.isFunction(wsfb.delegate.didNotConnectAccount)) {
						wsfb.delegate.didNotConnectAccount();
					}
				},
				success:function(data) {
					if(data.error) {
						if($.isFunction(wsfb.delegate.didNotConnectAccount)) {
							wsfb.delegate.didNotConnectAccount();
						}
					} else {
						if($.isFunction(wsfb.delegate.didConnectAccount)) {
							wsfb.delegate.didConnectAccount();
						}
					}
				}
			});
		}
		
		FB.Bootstrap.requireFeatures(["Connect"],function() {
			FB.Connect.requireSession(connectUser);
		});
	},
	"disconnectAccount":function() {
		var wsfb = WSFB.getInstance();
		$.ajax({
			type:	"GET",
			url:	wsfb.URL.disconnectUser,
			dataType: "json",
			error:	function() {
				if($.isFunction(wsfb.delegate.didNotDisconnectAccount)) {
					wsfb.delegate.didNotDisconnectAccount();
				}
			},
			success:function(data) {
				if(data.error) {
					if($.isFunction(wsfb.delegate.didNotDisconnectAccount)) {
						wsfb.delegate.didNotDisconnectAccount();
					}
				} else {
					if($.isFunction(wsfb.delegate.didDisconnectAccount)) {
						wsfb.delegate.didDisconnectAccount();
					}
				}
			}
		});
	},
	// responses
	"isConnected":function() {
		var wsfb = WSFB.getInstance();
	
		if($.isFunction(wsfb.delegate.isConnected)) {
			wsfb.delegate.isConnected();
		}
	},
	"isNotConnected":function() {
		var wsfb = WSFB.getInstance();
		
		if($.isFunction(wsfb.delegate.isNotConnected)) {
			wsfb.delegate.isNotConnected();
		}
	}
};

WSFB.prototype.login = function() {
	var wsfb = this;
	
	FB.Bootstrap.requireFeatures(["Connect"],function() {
		FB.Connect.requireSession(wsfb.didLogin);
	});
};

WSFB.prototype.logout = function() {
	var wsfb = this;
	function onLogout(result) {
		if($.isFunction(wsfb.delegate.didLogout)) {
			wsfb.delegate.didLogout(result);
		}
	}

	FB.Connect.logout(onLogout);
};

WSFB.prototype.newFeedPost = function(o) {
	var wsfb = this;
	/* Feed Dialog Options can be found here: http://wiki.developers.facebook.com/index.php/JS_API_M_FB.Connect.ShowFeedDialog */
	var callback = o.callback || function(postId, exception, data) {
		if($.isFunction(wsfb.delegate.didCompletePost)) {
			wsfb.delegate.didCompletePost(postId, exception, data);
		}
	};

	FB.Connect.showFeedDialog(o.template, o.data, o.target, o.body, null, 
		FB.RequireConnect.promptConnect, callback, o.prompt, {"value":o.message});
};

WSFB.prototype.didSetCurrentUser = function(result) {
	var wsfb = WSFB.getInstance();
	wsfb.currentUser = new WSFBUser(result[0]);
	
	if($.isFunction(wsfb.delegate.didSetCurrentUser)) {
		wsfb.delegate.didSetCurrentUser(wsfb.currentUser); 
	}
};

WSFB.prototype.didLogin = function() {
	var wsfb = WSFB.getInstance();
	
	if($.isFunction(wsfb.delegate.didLogin)) {
		wsfb.delegate.didLogin();
	}
};

WSFB.prototype.didLogout = function() {
	var wsfb = WSFB.getInstance();
	
	wsfb.currentUser = null;
	
	if($.isFunction(wsfb.delegate.didLogout)) {
		wsfb.delegate.didLogout();
	}
};

// Shortcut functions
WSFB.prototype.parse = function() {
	var wsfb = WSFB.getInstance();
	
	FB.ensureInit(function() {
		FB.XFBML.Host.parseDomTree();
	});
};

WSFB.prototype.checkConnection = function() {
	var wsfb = WSFB.getInstance();
	
	FB.Bootstrap.requireFeatures(["Connect"],function() {
		FB.Connect.ifUserConnected(wsfb.didLogin,wsfb.didLogout);
	});
};

WSFB.getInstanceAndRefresh = function(delegate) {
	if(WSFB.hasInstance()) {
		WSFB.getInstance(delegate).checkConnection();
	} else {
		WSFB.getInstance(delegate);
	}
};
WSFB.hasInstance = function() {
	if(this.__instance instanceof WSFB) {
		return true;
	} else {
		return false;
	}
};

// Getters & Setters
WSFB.getInstance = function(delegate) {
	if(WSFB.__instance instanceof WSFB) {
		if(delegate) {
			WSFB.__instance.setDelegate(delegate);
		}
		return WSFB.__instance;
	} else {
		return new WSFB(delegate);
	}
};

WSFB.prototype.setDelegate = function(delegate) {
	this.delegate = $.extend({}, WSFB.DEFAULT_DELEGATE, delegate);
};


/* 
 * Contains the default settings for convenience to the developers
 * Please change the values before using in any other context (aside from WeSeed).
 */
WSFB.DEFAULT_DELEGATE = {
	didConnectAccount:function() {
		this.isConnected();
	},
	didDisconnectAccount:function() {
		WSFB.getInstance().logout();
	},
	didNotDisconnectAccount:function() {
		$(".fb-disconnect").showRemoveAjaxMsg({txt:"We could not disconnect your account at this time."});
	},
	didNotFindWSAccount:function() {
		$(".fbdisconnected").hide();
		$(".fbconnected").show();
	},
	didFindWSAccount:function() {
		if(!WeSeed.isLoggedIn()) {
			if(!window.location.href.replace(WeSeed.url(),"").match(URL.account.accountPages)) {
				window.location.reload();
			} else {
				window.location = URL.portfolio.base;
			}
		}
	},
	isConnected:function() {
		$(".fbconnected").show();
		$(".fbdisconnected").hide();
		
		var wsfb = WSFB.getInstance();
		wsfb.parse();
		if(!WeSeed.isLoggedIn()) {
			wsfb.checkWSAccountStatus();
		}
		
		$(".signOutBtn").click(function(e) {
			e.preventDefault();
			WSFB.getInstance().logout();
		});
		
		$(".fb-logout").click(function(e) {
			e.preventDefault();
			wsfb.logout();
		});
		
		$(".fb-disconnect").click(function(e) {
			e.preventDefault();
			wsfb.disconnectAccount();
		});
	},
	isNotConnected:function() {
		WSFB.getInstance().parse();
		$(".fbconnected").hide();
		$(".fbdisconnected").show();
		$(".fb-logout").unbind("click");
		$(".fb-disconnect").unbind("click");
	},
	didLogin:function() {
		this.isConnected();
	},
	didLogout:function(result) {
		if(WeSeed.isLoggedIn()) {
			window.location = URL.account.logout;
		} else {
			this.isNotConnected();
		}
	}
};