Prolific.app('Facebook', function (facebook) {

		//Constants
	var APP_ID = '116161088401597',
		API_KEY = '48d9a1f71d046fd71e07b3c627f1e3dc',
		BTN_SELECTOR = 'a.go_fbconnect',
		BTN_LOGOUT_TEXT = 'Logout of Facebook',
		BTN_LOGIN_TEXT = 'Connect to Facebook',
		
		//Application state
		_loggedIn = false,
		
		//Caching objects
		_session = {},
		_user,
		_uid,
		
		//Private methods
		_updateButton = function () {
			$(BTN_SELECTOR).text(_loggedIn? BTN_LOGOUT_TEXT: BTN_LOGIN_TEXT);
		},
		_showLoading = function () {
			if ($.fancybox) {
				$.fancybox.showActivity();
			}
		},
		_hideLoading = function () {
			if ($.fancybox) {
				$.fancybox.hideActivity();
			}
		};
		
	//Content sharing features
	facebook.feature('sharing', function (sharing) {
		var _addShareButton = function (set) {
				$(set).each(function () {
					var $this = $(this);
					if ($this.children('.share_btn').length === 0) {
						$this.addClass('shareable').append('<a class="share_btn" href="javascript:;">Share on Facebook</a>');
					}
				});
			};
		sharing.method('connect', function (specs) {
			_addShareButton(specs.selector);
			$(specs.selector).find('.share_btn').click(function () {
				var $this = $(this),
					$parent = $this.parent();
				if (_loggedIn) {
					sharing.share.call($parent, specs);
				} else {
					facebook.login(function () {
						sharing.share.call($parent, specs);
					});
				}
				return false;
			});
		});
		sharing.method('share', function (specs) {
			FB.publish(specs.getInfo.call(this));
		});
	});

	//Initialize the facebook connect app
	facebook.module('init', function () {
		$(function () {
			if (window.location.protocol === 'https:') {
				$(BTN_SELECTOR).text('FB Connect Disabled');
				_loggedIn = 'locked';
			} else {
				
				//Insert fb-root
				$('body').append('<div id="fb-root"/>');
				
				//Get API Core
				$.getScript('http://static.ak.fbcdn.net/connect/en_US/core.js', function () {
					FB.init({
						apiKey: API_KEY,
						cookie: true,
						session: _session
					});
					facebook.checkStatus(facebook.login);
					FB.XFBML.parse();
				});
			}
						
		});
		return false;
	});
	
	//Public API
	facebook.ui.element('loginButton', function (btn) {		
		btn.event('click', function () {
			$(BTN_SELECTOR).live('click', function () {
				if (_loggedIn === 'locked') {
					alert('For security purposes, Facebook Connect is disabled on this page.');
					return false;
				}
				var action = _loggedIn === true? 'logout': 'login';
				facebook[action]();
				return false;
			});
		});
	});
	
	//Things to do when connected
	facebook.whenConnected = (function () {
		var register = [],
			self = function (fn) {
				if (_loggedIn) {
					fn();
				} else {
					register.push(fn);
				}
			};
		self.execute = function () {
			var i;
			for (i = 0; i < register.length; i += 1) {
				register[i]();
			}
		}
		return self;
	}());
	
	//Things to do when not connected
	facebook.whenNotConnected = (function () {
		var register = [],
			self = function (fn) {
				register.push(fn);
			};
		self.execute = function () {
			var i;
			for (i = 0; i < register.length; i += 1) {
				register[i]();
			}
		};
		return self;
	}());
	
	facebook.augment({
		getUserInfo: function (params, callback) {
			if (_user) {
				callback(_user());
			} else {
				FB.Data
					.query('select ' + (params || 'first_name, last_name') + ' from user where uid={0}', FB.getSession().uid)
					.wait(function (response) {
						_user = function () {
							return response[0];
						};
						callback(response[0]);
					});
			}
		},
		checkStatus: function (callback) {
			FB.getLoginStatus(function (response) {
				if (response.session) {
					facebook._onLogin();
				} else {
					facebook._onLogout();
				}
			});
		},
		login: function (callback) {
			var callback = callback || function () {};
			_showLoading();
			FB.login(function (response) {
				if (response.session) {
					facebook._onLogin();
					callback(response);
				} else {
					facebook._onCancelLogin();
				}
			});
		},
		logout: function () {
			_showLoading();
			FB.logout(facebook._onLogout);
		},
		_onLogin: function () {
			_loggedIn = true;
			_updateButton();
			facebook.whenConnected.execute();
			_hideLoading();
			facebook.getUserInfo('name', function (user) {
				if (user.name === 'Alexandria Hoff') {
					alert('Hello, Gypsy!');
				}
			});
			$('body').addClass('facebook_logged_in');
		},
		_onLogout: function () {
			_loggedIn = false;
			_user = null;
			_updateButton();
			_hideLoading();
			facebook.whenNotConnected.execute();
			$('body').removeClass('facebook_logged_in');
		},
		_onCancelLogin: function () {
			_hideLoading();
		}
	});

	
});
