var FacebookLoader = new Class({
	Implements: [Events],
	
	app_id: '',
	loaded: false,
	
	initialize: function(app_id) {
		this.app_id = app_id;
		this.addEvent('init', function() {
			this.onInit();
		}.bind(this));
	},
	
	onInit: function() {
		this.loaded = true;
		FB.init({
			appId: this.app_id,
			status: true,
			cookie: true,
			xfbml: true,
			channelUrl: window.location.protocol + '//' + window.location.host + '/channel.asp'
		});
	},
	
	publish: function(args) {
		var defaults = {
			url: location.href,
			name: '',
			caption: '',
			description: '',
			picture: '',
			onPublish: function(){},
			onSkip: function(){}
		};
		var options = $merge(defaults, args);
		
		if ( Facebook.loaded == true ) {
			FB.ui(
				{
					method: 'stream.publish',
					link: options.url,
					name: options.name,
					caption: options.caption,
					description: options.description,
					picture: options.picture
				},
				function(response, widget) {
					if (response && response.post_id) {
						options.onPublish(response);
					} else {
						options.onSkip(response);
					}
				}
			);
		} else {
			var url = 'http://www.facebook.com/sharer.php?u=' + encodeURIComponent(options.url);
			window.open( url );
		}
	},
	
	share: function(args) {
		var defaults = {
			url: location.href,
			callback: function(){}
		};
		var options = $merge(defaults, args);
		
		FB.ui(
			{
				method: 'stream.share',
				u: options.url
			},
			function() {
				options.callback();
			}
		);
	},
	
	parse: function(el) {
		if ( this.loaded == true ) {
			FB.XFBML.parse(el);
		}
	}
});


var FacebookPopup = new Class({
	Implements: [Options, Events],
	
	advisor: null,
	
	options: {
		cookie: '',
		refererCookie: 'FzReferer',
		disabledOnThisPage : false,
		promo: '',
		advisor: {
			width: 500,
			theme: 'private',
			useOverlay: true,
			overlayTheme: 'private',
			overlayOpacity: 0.65,
			centerVertically: true,
			customNavigation: true,
			destroyOnClose: true
		}
	},
	
	initialize: function(options) {
		this.setOptions(options);
		
		var self = this;
		this.addEvents({
			cookieFound: function() { self.onCookieFound(); },
			advisor: function() { self.onAdvisor(); },
			closeAdvisor: function() { self.onCloseAdvisor(); },
			like: function(args) { self.onLike(args); }
		});
		
		// set up callback for when user clicks Facebook like button
		FB.Event.subscribe('edge.create', function(response, widget) {
			self.fireEvent('like', {'response': response, 'widget': widget});
		});
		
		if ( !this.options.disabledOnThisPage ) {
			this.checkCookie.bind(this).delay(4000);
		}
	},
	
	initLinks: function(links) {
		var self = this;
		links.addEvent('click', function(e) {
			Cookie.write(self.options.refererCookie, self.options.cookie, {duration: 20, domain: Tools.cookieDomain, path: '/'});
			return true;
		});
	},
	
	checkCookie: function() {
		if ( Cookie.read(this.options.refererCookie) == this.options.cookie) {
			this.fireEvent('cookieFound');
		}
	},
	
	onCookieFound: function() {
		// destroy the referer cookie
		Cookie.write(this.options.refererCookie, '', {duration: 20, domain: Tools.cookieDomain, path: '/'});
		
		var cookie = Cookie.read(this.options.cookie);
		
		// has the user interacted with this popup?
		if ( cookie != 'skipped' && cookie != 'liked' ) {
			this.showAdvisor();
		}
	},
	
	showAdvisor: function() {
		if ( this.advisor == null ) {
			this.loadAdvisor();
			return;
		}
		
		this.advisor.show();
	},
	
	hideAdvisor: function() {
		this.advisor.hide();
	},
	
	loadAdvisor: function() {
		var self = this;
		
		this.options.advisor.onContentLoaded = function() {
			self.fireEvent('advisor');
		};
		this.options.advisor.onCloseButton = function() {
			self.fireEvent('closeAdvisor');
		};
		
		this.advisor = new ForzieriAdvisor(this.options.advisor);
	},
	
	onAdvisor: function() {
	},
	
	onCloseAdvisor: function() {
		// log the fact that the user closed this popup
		Cookie.write(this.options.cookie, 'skipped', {duration: 20, domain: Tools.cookieDomain, path: '/'});
	},
	
	onLike: function(args) {
		// log the fact that the user clicked the Like button
		// we're only interested in Like buttons on the showcase page or in the FacebookFanAdvisor popup
		var button = args.widget._attr.ref;
		if ( button == this.options.promo || button == 'FacebookFan' ) {
			Cookie.write(this.options.cookie, 'liked', {duration: 20, domain: Tools.cookieDomain, path: '/'});
		}
	}
});
