﻿// ==UserScript==
// @name           Better Facebook
// @namespace      http://userscripts.org/users/86416
// @include        http://*.facebook.com/*
// @include        http://facebook.com/*
// @include        https://*.facebook.com/*
// @include        https://facebook.com/*
// @include        http://*.facebook.tld/*
// @include        http://facebook.tld/*
// @include        https://*.facebook.tld/*
// @include        https://facebook.tld/*
// ==/UserScript==
/*
Better Facebook
(c) 2010 Matt Kruse
http://BetterFacebook.net

*/
var DEBUG = false;
var PERFORMANCE = false;
var is_chrome=false;
is_chrome = true;

// Main Script
// -----------
(function() { 


// Greasemonkey API for Chrome/Safari
if (is_chrome) {
	GM_addStyle=function(css) {
		var style = document.createElement('style');
		style.textContent = css;
		document.getElementsByTagName('head')[0].appendChild(style);
	}
	GM_deleteValue=function(name) {localStorage.removeItem(name);}
	GM_getValue=function(name, defaultValue) { return localStorage.getItem(name) || defaultValue;}
	GM_log=function(message) {console.log(message);}
	GM_setValue=function(name, value) {
		try {
			localStorage.setItem(name, value);
		} catch (e) {
			if (e.toString().indexOf('QUOTA_EXCEEDED_ERR')>-1) {
				// Catch the quota exceeded error and try to remove other keys. Facebook fills users' localStorage with junk sometimes!
				var removed=0;
				var lsprefs = "Number of keys: "+localStorage.length+"\n";
				var totalsize = 0;
				for (var i=0; i<localStorage.length; i++) {
					var key = localStorage.key(i);
					var val = localStorage.getItem(key);
					totalsize += val.length;
					lsprefs += key+": "+val.length+"\n";
					if (key=="prefs" || key.indexOf("sr:")==0) {
						localStorage.removeItem(key);
						removed++;
					}
				}
				lsprefs += "Total localStorage used: "+totalsize;
				showerror("Your browser's local storage area is full!<br>Please <a href=\"http://betterfacebook.net/faq.php#quota\" target=\"_blank\">Read the FAQ</a> for a detailed explanation of this error, and save the data below which will be helpful in debugging this error.",lsprefs);
				if (removed>0) {
					showerror("Removed "+removed+" items from localStorage to make room");
				}
				// Now try again. We may still get an error, but at least we tried!
				localStorage.setItem(name,value);
			}
		}
	}
	GM_getScript=function(url) {
		var head = document.getElementsByTagName('head')[0];
		var script = document.createElement('script');
		script.src=url;
		head.appendChild(script);
	}
	GM_xmlhttpRequest=function(obj) {
		var request=new XMLHttpRequest();
		request.onreadystatechange=function() { if(obj.onreadystatechange) { obj.onreadystatechange(request); }; if(request.readyState==4 && obj.onload) { obj.onload(request); } }
		request.onerror=function() { if(obj.onerror) { obj.onerror(request); } }
		try { request.open(obj.method,obj.url,true); } catch(e) { if(obj.onerror) { obj.onerror( {readyState:4,responseHeaders:'',responseText:'',responseXML:'',status:403,statusText:'Forbidden'} ); }; return; }
		if(obj.headers) { for(name in obj.headers) { request.setRequestHeader(name,obj.headers[name]); } }
		request.send(obj.data); return request;
	}
	if (typeof unsafeWindow=="undefined") { unsafeWindow=window; }
}

// Specifically for Opera
if (window.opera && !/https?:\/\/[^\/]*\.?facebook\.[^\/]+\//.test(location.href)) { return; }


// Don't run on link redirects and some other cases
try { 
	if (location.href.indexOf('/l.php?u')>0 || location.href.indexOf('/ai.php')>0) { return; } 
	if (location.href.indexOf('/plugins/')>0) { return; }
} catch(e) { }

var version = 4.500;
var is_extension_local=true;

// ==================================================================
// TRACE functions
// ==================================================================
var performance_monitor_enabled = false;
var tracelog = "";
var trace_stack = "";
var trace_stats = {};
var trace_window = null;
var trace_update_interval = null;
var trace_stack_update_interval = null;
var tracing_paused = false;
var trace = function(str) {
	tracelog += str+"<br>";
	trace_log(str);
}
var trace_start = function(f,details,tracestack) {
	if (!performance_monitor_enabled || tracing_paused) { return; }
	if (typeof tracestack=="undefined") { tracestack=false; }
	var n = f.name || f || "undefined";
	var o = trace_stats[n];
	if (typeof o=="undefined") {
		trace_stats[n] = {name:n,count:0,start:0,elapsed:0};
		o = trace_stats[n]
	}
	o.count++;
	o.start = +(new Date);
	if (tracestack) {
		trace_log(n+" "+(details||""));
	}
}
var trace_end = function(f) {
	if (!performance_monitor_enabled || tracing_paused) { return; }
	var n = f.name || f || "undefined";
	if (n) {
		var o = trace_stats[n];
		if (o && o.start) {
			o.elapsed += ( +(new Date) - o.start );
		}
	}
}
var trace_log = function(s) {
	trace_stack += s+"<br>";
}
var trace_update = function() {
	if (!performance_monitor_enabled) { if (trace_update_interval!=null) { clearInterval(trace_update_interval); } return; }
	tracing_paused = true;
	if (trace_window==null) {
		var d = document.createElement('div');
		d.innerHTML = '<div id="bfb_trace_window_header" style="float:right;">(Disable this window in Options-&gt;Debug, uncheck Performance Monitoring)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#" onclick="w=document.getElementById(\'bfb_trace_window\');if(w){w.style.display=\'none\';}">hide</a></div><div style="clear:both;"></div><div id="bfb_trace_window_body"></div><div id="bfb_trace_window_call_stack"></div>';
		d.id="bfb_trace_window";
		document.body.appendChild(d);
		trace_window = d;
	}
	var f,trace_funcs=[];
	var h = '<table><thead><tr><th>Function</th><th>Calls</th><th>Elapsed</th><th>Avg</th></tr></thead><tbody>';
	for (f in trace_stats) {
		trace_funcs.push(f);
	}
	trace_funcs = trace_funcs.sort( function(a,b) { return trace_stats[a].elapsed<trace_stats[b].elapsed } );
	for (var i=0; i<trace_funcs.length; i++) {
		var o = trace_stats[trace_funcs[i]];
		h += "<tr><td>"+o.name+"</td><td>"+o.count+"</td><td>"+o.elapsed+"</td><td>"+(o.elapsed/o.count).toFixed(2)+"</td></tr>";
	}
	h += "</tbody></table>";
	html($('bfb_trace_window_body'),h);
	tracing_paused = false;
}
var trace_stack_update = function() {
	if (!performance_monitor_enabled) { if (trace_stack_update_interval!=null) { clearInterval(trace_stack_update_interval); } return; }
	tracing_paused = true;
	if (trace_stack!="") {
		var stack = $('bfb_trace_window_call_stack');
		if (stack && stack.innerHTML && stack.innerHTML.length>500000) {
			html(stack,"");
		}
		if (stack) {
			appendhtml(stack,trace_stack);
			stack.scrollTop=99999;
			trace_stack = "";
		}
	}
	tracing_paused = false;
}
bind(window,'load',trace_update);
var trace_update_interval = setInterval(trace_update,5000);
var trace_stack_update_interval = setInterval(trace_stack_update,1000);

// ==================================================================
// DOM Node Insertion
// ==================================================================
var internalUpdate = false; // FLAG to keep track of internal moves which should NOT trigger the DOMNodeInserted hooks!
var domNodeInsertedHandlers = {};
var domNodeInsertedStreamHandlers = {};
function watchDOMNodeInserted(selector,func,watch_stream) {
	var f = {"selector":selector,"handler":func};
	if (watch_stream) {
		if (typeof domNodeInsertedStreamHandlers[selector]=="undefined") {
			domNodeInsertedStreamHandlers[selector]=[];
		}
		domNodeInsertedStreamHandlers[selector].push(f);
	}
	else {
		if (typeof domNodeInsertedHandlers[selector]=="undefined") {
			domNodeInsertedHandlers[selector]=[];
		}
		domNodeInsertedHandlers[selector].push(f);
	}
}
function handleDomInsertion(e) {
	var f,id,selector,el,els;
	var o = e.target;
	if (o.nodeType==3 || internalUpdate) { return; }
	var tn = o.tagName;
	if (tn=="SCRIPT" || tn=="LINK" || tn=="INPUT" || tn=="BR" || tn=="STYLE") { return; }

	if (PERFORMANCE) { trace_start("handleDomInsertion"); trace_log("Inserted: "+outerHTML(o,true)); }

	var processed = false;
	// If the insertion is a minifeedwall or something within a minifeedwall, check the option to make sure it should be processed
	var isMiniFeedWall = ((getParentByClass(o,"minifeedwall")!=null) || (getParentByClass(o,"fbProfileStream")!=null) || (o.getElementsByClassName('minifeedwall').length>0));
	if ( !isMiniFeedWall || processProfiles) {
		// If it's a story itself, process it
		if ( hasClass(o,storyClass)) {
			processed = true;
			fixStory(o,isMiniFeedWall);
		}
		// Otherwise, process any stories within it
		else if (o && o.getElementsByClassName) {
			var stories = o.getElementsByClassName(storyClass);
			if (stories && stories.length>0 && !QS(o,'.permalink_stream')) {
				processed = true;
				fixStories (stories , isMiniFeedWall );
			}
		}
		if (processed) {
			elementLoad(o,domNodeInsertedStreamHandlers);
		}
	}
	if (!processed) {
		// Check for handling of queries
		elementLoad(o,domNodeInsertedHandlers);
		
		// If it's a new comment being inserted, check to see if we should mark the post as read
		if (mark_read_on_comment && hasClass(o,comment_class_name)) {
			var story = getParentByClass(o,storyClass);
			if (story && hasClass(story,"bfb_processed")) {
				mark_post_read(story,true);
			}
		}
	}
	
	if (PERFORMANCE) { trace_end("handleDomInsertion"); }
}
// Fire a list of handlers on an element when it is inserted
function elementLoad(o,handler_list) {
	var selector, els, id;
	for (selector in handler_list) {
		els = null;
		id = null;
		if (selector.indexOf("#")==0) { id=selector.substring(1); }
		if (id && o.id && id==o.id) { els=[o]; }
		else { els=o.querySelectorAll(selector); }
		if (els) {
			var funcs = handler_list[selector];
			for (var i=0; i<funcs.length; i++) {
				for (var j=0; j<els.length; j++) {
					funcs[i].handler(els[j],selector,o); 
				}
			}
		}
	}

}
// Fix anything added later
bind(document,"DOMNodeInserted", handleDomInsertion);

// ===================================================
// UNLOAD HANDLER
// ===================================================
bind(window,'hashchange',function(e) {
	unload();
});

onIdLoad('mainContainer',function(c){
	// If it has a tab container already, try to fix it
	var tab_container = c.querySelector(".bf_tabs");
	if (tab_container) {
		attachTabContainerClickHandler(tab_container);
		// Force all the tabs to update their counts
		var tabs = tab_container.querySelectorAll(".bf_tab");
		for (var i=0; i<tabs.length; i++) {
			var tab_id = tabs[i].id;
			updateTab(tab_id);
			attachTabCountUpdateHandler(tab_id);
		}
	}
})

// This is before frame check because it shows up in iframe in Firefox (though not in Chrome)
// Select All friends in popup
GM_addStyle('.select_all_friends { font-size:11px; line-height:15px; font-weight:bold; margin-left:10px; padding:3px 10px; -moz-border-radius:5px; -webkit-border-radius:5px; border:1px solid #6D84B4; background-color:white; } ');
onIdLoad('fb_mfs_body',function(body) {
	var link = el('a','select_all_friends',null,null,'Select All');
	bind(link,'click',function() {
		var friends = document.querySelectorAll('#all_friends li a');
		for (var i=0; i<friends.length; i++) {
			var f = friends[i];
			if (!hasClass(f,"disabled")) {
				clickLink(f);
			}
		};
	});
	append(body.querySelector('#finder_friend_typeahead'),link);
});

// ===================================================
// Don't run in frames
// ===================================================
try {
	var tryagain = true;
	try {
		if (window && window.self && window.top) {
			if (window.self!=window.top) {
				return;
			}
			tryagain = false;
		}
	} catch(e) { }
	if (tryagain) {
		if (typeof unsafeWindow!="undefined" && (unsafeWindow!=unsafeWindow.top || unsafeWindow!=unsafeWindow.parent)) { 
			return;
		}
	}
} catch(e) { return; }

// ===================================================
// RPC MESSAGING
// ===================================================
// postMessage tests
/*
function getRemoteMessage(url,id) {
	var iframe = el('iframe');
	if (id) { url+="?id="+id; }
	iframe.src = url;
	iframe.style.top="-500px";
	iframe.style.left="-500px";
	iframe.style.position="absolute";
	iframe.style.visibility="hidden";
	if (id) {
		iframe.id = id;
	}
	document.body.appendChild(iframe);
}
bind(window,'message',function(e) {
	var msg = e.data;
	var origin = e.origin;
	if (/betterfacebook\.net/.test(origin)) {
		show_dialog(msg);
	}
});
getRemoteMessage("http://BetterFacebook.net/post_message.html","test");
*/


// Auto-click "Older Posts"
bind(window,'load',function() {
	onSelectorLoad('.fbOlderPosts,.uiMorePager a.lfloat',clickOlderPosts);
});

// Function to actually click Older Posts
var misfires=0;
function clickOlderPosts(a) {
	var clicked = false;
	try {
		if (a && olderPostsClickCount<maxOlderPostsClickCount) {
			if (!hasClass(a,"async_saving")) {
				trace_log("clicking Older Posts!");
				try {
					if (a.onclick) {
						a.onclick();
						clicked = true;
					}
				} catch(e) { }
				if (!clicked) {
					clickLink(a);
				}
				update_status('bfb_status_older',++olderPostsClickCount);
			}
			else { trace_log("Not clicking Older Posts (has class async_saving)"); if (misfires++<20) { setTimeout(function(){clickOlderPosts(a);},1000); } }
		}
		else { trace_log("Not clicking Older Posts (already too many)"); }
	} catch(e) { setTimeout(function(){clickOlderPosts(a);},1000);  }
}

// ==================================================================
// ERROR REPORTING
// Setup error-reporting really early so we can trap early errors
// ==================================================================
addGlobalStyle('.bfb_error_container { position:fixed; z-index:999; top:5px; right:5px; width:300px; background-color:#cc5555; border:1px solid black; -moz-border-radius: 10px; -webkit-border-radius: 10px; padding:5px; font-size:18px; color:white; text-align:center; max-height:800px; overflow:auto; } '+
				'.bfb_error_container .bfb_note { font-size:12px; } '+
				'#bfb_error_close { float:right; cursor:pointer; } '+
				'.bfb_error { border:1px solid #ccc; padding:2px; margin:5px; background-color:white; -moz-border-radius: 5px; -webkit-border-radius: 5px; font-size:12px; color:black; text-align:left; } '+
				'.bfb_error .bfb_data { max-height:150px; overflow:auto; font-size:10px; border:1px solid #ccc; } '+
				'#bfb_error_link { text-decoration:underline; color:#ccccff; }');
var showerror_container;
function showexception(e) { var str = e.toString(); if(e.lineNumber){ str+=" line #"+e.lineNumber; } showerror(str); }
function showerror(msg,data) { if (typeof(options)=="undefined" || options.get('show_errors')) { if (data){msg+='<div class="bfb_data">'+(htmlescape(data).replace(/\n/g,"<br>"))+'</div>';} showusermessage(msg); } }
function showconflict(msg) { if (typeof(options)=="undefined" || options.get('show_conflicts')) { showusermessage(msg); } }
function showusermessage(msg) {
	if (!showerror_container) {
		showerror_container = el('div','bfb_error_container',{id:'bfb_error_container'},null,"<img src=\""+close_img+"\" id=\"bfb_error_close\">Better Facebook Error!<br><div class=\"bfb_note\">(These errors may be disabled in <a href=\"#\" id=\"bfb_error_link\" onclick=\"return false;\">Options-&gt;Debug</a>)</div><br><div class=\"bfb_note\">See the <a href=\"http://BetterFacebook.net/faq.php\">FAQ</a> for help!</div>");
		append(document.body,showerror_container);
		bind('bfb_error_link','click',function() { better_fb_options('bf_t_debug'); return false; } );
		bind('bfb_error_close','click',function() { showerror_container.style.display="none"; });
	}
	var m = el('div','bfb_error',null,null,msg);
	append(showerror_container, m);
	showerror_container.style.display="block";
	m.scrollIntoView();
}


trace("Browser:"+navigator.userAgent);
trace("BFB Version:"+version);
var type = "";
if (typeof isExtension!="undefined" && isExtension) { 
	type+="Add-On";
	if (is_extension_local) { type+=" (local)"; }
} else if (is_chrome) { type="Chrome Extension"; }
else { type="User Script"; }
trace("Type:"+ type);

// ==================================================================
// First order of business - find out who we are!
// ==================================================================
var userid = "anonymous";
var m,a = $('navAccountPic');
if (a && a.href && /profile/i.test(a.href)) {
	var href = a.href;
	if (m = href.match(/id=(\d+)\b/)) { userid = m[1]; }
	else if (m = href.match(/\/([a-z0-9\.]+)\?ref=profile/)) { userid = m[1]; }
}
else if (a && a.href) {
	if (m=a.href.match(/facebook\.[^\/]+\/(.*)/)) {
		userid = m[1];
	}
}
trace("userid="+userid);

// ==================================================================
// OPTIONS
// ==================================================================
var options = new GM_options('better_facebook',userid);
performance_monitor_enabled = options.get('performance_monitor');

var option_keys = [];
// Script Options
if (options) {
	var a = function(name,type,def,opt) { options.addOption(name,type,def,opt); trace(name+"="+options.get(name)); }
	// RIGHT SIDEBAR
	a('pagelet_toggle','checkbox','true');
	a('show_friend_tracker','checkbox',true);
	a('friend_tracker_duration','input',3,{size:2} );
	a('friend_tracker_interval','input',1,{size:2} );
	a('friend_tracker_last_update','hidden',null);
	a('friend_tracker_content','hidden',null);

	a('show_group_activity','checkbox',true);
	a('group_activity_interval','input',1,{size:2} );
	a('group_activity_last_update','hidden',null );
	a('group_activity_content','hidden',null );

	a('show_friend_activity','checkbox',true );
	a('friend_activity_interval','input',1,{size:2} );
	a('friend_activity_show_pics','checkbox',true );
	a('friend_activity_hide_text','input','^Profile Picture$',{size:15} );
	a('friend_activity_last_update','hidden',null );
	a('friend_activity_content','hidden',null );
	a('friend_activity_last_seen','hidden','' );

	a('hide_connect_box','checkbox',false );
	a('hide_suggestions_box','checkbox',false );
	a('hide_events_box','checkbox',false );
	a('hide_beta_box','checkbox',false);
	a('hide_recommended_pages_box','checkbox',false);
	a('hide_pokes','checkbox',false);
	a('hide_get_connected','checkbox',false);
	a('hide_questions','checkbox',false);

	// LEFT PANEL
	a('show_nav_all_connections','checkbox',true );
	a('show_nav_edit_friends','checkbox',true );
	a('show_nav_write_a_note','checkbox',true );
	a('show_nav_pages_i_admin','checkbox',true );
	a('show_nav_unblock_applications','checkbox',true );

	a('expand_nav_apps','checkbox',false );
	a('expand_nav_messages','checkbox',false );
	a('expand_nav_events','checkbox',false );
	a('expand_nav_photos','checkbox',false );
	a('expand_nav_friends','checkbox',false );
	a('expand_nav_friends_full','checkbox',false );
	a('hide_status_updater','checkbox',false );
	
	a('hide_chat_panel','checkbox',false);
	a('show_friends_on_chat_when_offline','checkbox',false);

	a('show_my_pages','checkbox',true );
	a('my_pages_new_window','checkbox',true );
	a('my_pages_default_open','checkbox',true );
	a('my_pages_position','input','3',{size:2} );
	a('my_pages_max_height','input','700',{size:3} );

	a('show_my_events','checkbox',true );
	a('my_events_new_window','checkbox',true );
	a('my_events_default_open','checkbox',false );
	a('my_events_position','input','4',{size:2} );
	a('my_events_max_height','input','700',{size:3} );

	a('show_my_groups','checkbox',true );
	a('my_groups_new_window','checkbox',true );
	a('my_groups_default_open','checkbox',false );
	a('my_groups_position','input','5',{size:2} );
	a('my_groups_max_height','input','700',{size:3} );

	a('show_my_apps','checkbox',true );
	a('my_apps_new_window','checkbox',true );
	a('my_apps_default_open','checkbox',false );
	a('my_apps_position','input','6',{size:2} );
	a('my_apps_max_height','input','700',{size:3} );

	a('show_friends_by_network','checkbox',true );
	a('friends_by_network_new_window','checkbox',true );
	a('friends_by_network_default_open','checkbox',false );
	a('friends_by_network_position','input','7',{size:2} );
	a('friends_by_network_order_by_count','checkbox',false );
	a('friends_by_network_max_height','input','700',{size:3} );

	// DISPLAY OPTIONS
	a('expand_similar_posts','checkbox',false );
	a('expand_similar_posts_delay','input','1000',{size:4} );
	a('display_control_panel','checkbox',true );
	a('process_profiles','checkbox',true );
	a('hide_options_icon','checkbox',false );
	a('left_align','checkbox',false );
	a('pin_notifications','checkbox',false );
	a('pin_notifications_right_panel','checkbox',false );
	a('pin_notifications_width','input','',{size:5} );
	a('force_most_recent_feed','checkbox',true );
	a('auto_click_more_times','input',0,{size:2} );
	a('alternate_read_display','checkbox',false );
	a('reload_when_mark_all_read','checkbox',false );
	a('auto_mute_count','input',0,{size:3} );
	a('auto_mute_all','checkbox',false );
	a('hide_when_muted','checkbox',true );
	a('hide_old_comments','checkbox',true );
	a('hide_update_email','checkbox',false );
	a('reorder','checkbox',false);
	a('show_char_counter','checkbox',true);
	a('static_header','checkbox',false);
	a('static_left_col','checkbox',false);
	a('hide_notification_pictures','checkbox',false);
	a('show_post_actions','checkbox',true);
	a('post_action_opacity2','input','.5',{size:3});
	a('post_action_zoom','input','100',{size:3});
	a('hide_post_actions_until_hover','checkbox',false);
	a('show_notification_previews','checkbox',true);
	a('float_control_panel','checkbox',false);
	a('floating_cp_opacity','input','.75',{size:3});
	a('floating_cp_offset','input','0',{size:2});
	a('hide_hovercard','checkbox',false);
	a('cp_button_mark_all_read','checkbox',true);
	a('cp_button_show_hide_all','checkbox',true);
	a('cp_button_mute_all','checkbox',true);
	a('cp_button_reload','checkbox',true);
	a('cp_button_help','checkbox',true);
	a('auto_expand_comments','checkbox',false);
	a('expand_see_more','checkbox',false);
	a('process_recent_activity','checkbox',false);
	a('chat_images_to_names','checkbox',false);
	a('post_font_size','input','',{size:4});
	a('remove_recent_activity','checkbox',true);
	a('stretch_wide','checkbox',false);
	
	// ADVANCED
	a('fix_logo2','checkbox',true);
	a('home_url','input','/',{size:20} );
	a('preview_img_max_width2','input','200',{size:4} );
	a('preview_img_max_height2','input','150',{size:4} );
	a('show_options_save_message','checkbox',true);
	a('comment_expire_days','input','14',{size:4} );
	a('highlight_suggest_to_friends','checkbox',true);
	a('open_app_link_in_tab','checkbox',false);
	a('open_app_link_marks_read','checkbox',false);
	a('mark_read_on_comment','checkbox',false);
	a('show_page_post_message','checkbox',true);
	a('allow_bfb_formatting','checkbox',true);
	a('sprite_url','input','',{size:20});
	
	// MISC
	a('show_version_changes','checkbox',true );
	a('check_for_updates','checkbox',true );
	a('update_check_interval','input','3',{size:3} );
	a('debug','checkbox',false );
	a('show_errors','checkbox',true);
	a('show_conflicts','checkbox',true);
	a('performance_monitor','checkbox',false);
	
	// CSS
	a('css_url','input','',{size:50} );
	a('css','textarea','',{rows:25,cols:80} );

	// FEED FILTER
	a('always_show_tabs','checkbox',false);
	a('tab_all_apps','checkbox',true);
	a('tab_count','checkbox',true);
	a('filters','hidden',[]);
	a('feed_filter_show_help','hidden',true);
	a('filters_enabled','checkbox',true);
	a('custom_apps','input','',{size:80});
	a('filter_profiles','checkbox',true);
	
	a('friend_list_interval','input',1,{size:3} );

	// Hidden options
	a('highlight_cp','hidden',true );
	a('version','hidden',0 );
	a('version_ack','hidden',0 );
	a('last_update_check','hidden',0 );
	a('last_update_check','hidden',0 );
	a('last_msg','hidden',0 );
	a('installed_on','hidden',0 );
}

// Log the filters
trace("filters="+JSON.stringify(options.get('filters')));

// Set the install time of the script
if (options.get('installed_on')==0) {
	options.set('installed_on',time(),true);
}
else { trace("installed_on="+options.get('installed_on')); }

// DEBUG?
var DEBUG = options.get('debug');
var PERFORMANCE = options.get('performance_monitor');
function debugmsg(str) {
	return '<div class="debug_small">'+str+'</div>';
}

var info_icon = "\"data:image/gif,GIF89a%10%00%10%00%E6%7F%00%B7%8A%2BrV%1A666%9B%9B%9B%B1%86)%F5%BCB%D6%A33%CE%9D1qqq7)%0C%FF%C6%3F)%1E%09%FD%C0%3C%F5%BA%3A%DC%B2V%03%03%02%1C%1C%1C%1C%15%07%09%09%09III%0E%0E%0D%11%11%11%12%0E%032%26%0B%FF%C2%3C%FC%BF%3C%FF%C3%3D%FF%C4%3D%F9%BD%3A%FF%C2%3D%FB%BE%3B%FC%BF%3BWWW%E5%E5%E5%F1%B79%86%86%86%FA%FA%FA%95%95%95%FF%CDR%FB%BF%3C*'%20%FF%C1%3BG%3E(%FF%C6A%E4%E4%E4%9Dw%24OOO%E2%AB4%FF%D2c%F8%C2O%CF%AAY%E9%B17%FB%BF%3B%F2%B89%17%17%17%60%60%60%B8%97O%FF%C8%40%FF%C9C%F8%BC%3AK%3D%1E%F3%C1X%84n%3F%FB%BE%3A%B7%B7%B7%C7%A1MJJJ%AB%8FRhhhbJ%16%E9%B6F%A5%A5%A5%FA%C8%5B%CC%9B%2F%93w8%E1%E1%E1%B3%8B4%B1%B1%B1%7B%5D%1C%80f-%A8%A8%A8%FA%C3E%8Dk!%2C!%0A6*%10%06%07%0A%0A%08%02%FE%C2%3C%AE%AE%AE%BC%8E%2C%D5%A6C%FF%C6%3D%FF%C3%3F%C6%96%2F%3B%3B%3B%EF%B58%DF%DF%DFggg%BE%99J%E7%AE6yb4%FF%CBA%98%98%98%C1%93-%7B%7B%7B%FF%C3961(%AA%83%2F%AE%85%2C%82k%3A5%2F%24%FA%BE%3B%FB%BE9%B5%B5%B5%FD%BF9222%DC%ABA%FE%C1%3C%CF%9E1%FF%C4BC%3A%24%22%22%22%96%96%96%17%16%11%A3%7C'%F9%BD%3B%00%00%00%FF%FF%FF!%F9%04%01%00%00%7F%00%2C%00%00%00%00%10%00%10%00%00%07%DE%80%7F%82%83s%14%15%5E%83%89%83%23~U*%3C%0F~%8A%89~n81%05%04%09~%03%93~j%0E90%26%5B%07%9B%8A%126AiHCk%0D%18g%16%10%83D%0F%3E%2BW%0E%0F%0F%5D%1A%0CR~%08%82%14(Fr%5C2~~%00%1A'%22%09%15%82~m%0A%1C%1D%BB%0F%07%1Do%18-%0F%7Fy%7BZ)%7D4%05T%0B_%19%7D%193%0B%02%12xQ%3F%7D%1CwbL%0C%7D%FC%0A%01%12%12%C8%E8%E0%D0%07N%0F%25ljx%E0%A7%81%00%05%09O%CA%2C%C4%40%C7O%02%11%EC%18%7C%00%B0G%C2%02%03%1F6l%D8%C1'K%86%3A%1D%1A%18%08%F0%00%81%1F%0BE%F8%24y%81a%C3%18%3B%04%9C%5Cx%00BP%BC%97%11%A6%5CX%10%C1%8A%1FZ%8A%D0%FCq1a%C2%1F%10a%12%05%02%00%3B\"";
// ==================================================================
// Check if we're on apps.facebook.com - if so, display a warning and get out of here!
// ==================================================================
var href = "";
try { href = location.href; } catch(e) { }
if (href.indexOf("apps.facebook")>=0) {
	if (document.querySelector('.UIIntentionalStream')!=null) {
		var warning_pref = 'show_apps_warning';
		if (!GM_getValue(warning_pref,true)) { return; }
		GM_addStyle(" #bfb_message_bar { position:fixed; top:0px; left:0px; height:0px; border-bottom:3px solid #666; background:#ffffe1 url("+info_icon+") no-repeat 5px center; width:100%; z-index:999999; padding:5px 0px 3px 30px; font-size:14px; overflow:hidden; } #bfb_message_bar a { padding:0px 5px; text-decoration:underline; font-weight:bold; } ");
		var bar = document.createElement('div');
		bar.id = "bfb_message_bar";
		bar.innerHTML = "Better Facebook does not run on apps.facebook.com.";
		
		var link1 = document.createElement("a");
		link1.href=location.href.replace("apps","www");
		link1.innerHTML = "Go to www.facebook.com";
		bar.appendChild(link1);
		
		var link2 = document.createElement("a");
		link2.href="#";
		link2.innerHTML = "Hide this message";
		link2.addEventListener('click',function(e){document.getElementById('bfb_message_bar').style.display="none";e.preventDefault();},false);
		bar.appendChild(link2);

		var link3 = document.createElement("a");
		link3.href="#";
		link3.innerHTML = "Don't show again";
		link3.addEventListener('click',function(e){GM_setValue(warning_pref,false);document.getElementById('bfb_message_bar').style.display="none";e.preventDefault();},false);
		bar.appendChild(link3);
		
		document.body.appendChild(bar);
		var size = 0;
		var expand = function() {
			size+=2;
			bar.style.height = size+"px";
			if (size<22) { setTimeout(expand,100); }
		}
		expand();
	}
	return;
}

// ==================================================================
// Test to make sure settings "stick"
// ==================================================================
var t = "test"+(new Date()).getTime();
setValue("bfb_test",t,function(key,val) {
	if (t!=getValue("bfb_test")) { showerror("Better Facebook is unable to correctly save its settings! Please see the <a href=\"http://betterfacebook.net/faq.php#saveprefs\">FAQ</a> for troubleshooting!"); }
});

// ==================================================================
// Check for conflict with other scripts
// ==================================================================
function conflict(name) { showconflict(name+" has been detected. Running other Facebook scripts may cause problems or browser instability if they try to touch the same things! If you are confident that these two scripts will behave together, you can disable warning messages like this in Options-Debug."); }
onIdLoad('FBPPdiv',function() { conflict("Facebook Fixer"); });
onIdLoad('ff-logout',function() { conflict("FFixer"); });
// Check to make sure that Add-on _and_ Greasemonkey script are not both installed
function show_conflict_msg() { showerror("It looks like you have both the Firefox Add-on and the Greasemonkey script for Better Facebook installed! This causes problems, and only one should be installed. Go to Tools->Add-ons and disable Better Facebook to leave only the Greasemonkey script running, then restart Firefox."); }
onIdLoad("content",function() {
	if (document && document.body && document.body.className) {
		var cn = document.body.className;
		if (typeof isExtension!="undefined" && isExtension) {
			if (cn.indexOf('bf_gm')>-1) { show_conflict_msg(); }
			document.body.className += " bf_extension";
		}
		else {
			if (cn.indexOf('bf_extension')>-1) { show_conflict_msg(); }
			document.body.className += " bf_gm";
		}
	}
});

// ==================================================================
// CONSTANTS
//
// FACEBOOK CLASS NAMES, ETC
// These are defined up-top because Facebook seems to change them randomly
// ==================================================================
var messageContentClasses = {uiStreamMessage:true,GenericStory_Message:true};
var messageContentClass = null;
var feedCommentClass = "commentList";
var timestampClass = " uiStreamSource timestamp ";
var streamContainerClass = "UIIntentionalStream_Content";
var streamCollapsedClass = "uiStreamCollapsed";
var storyClass = "uiUnifiedStory";

var page_iframe = '<iframe src="http://www.facebook.com/plugins/likebox.php?id=174424289341&amp;width=292&amp;connections=0&amp;stream=false&amp;header=false&amp;height=62" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:292px; height:62px;" allowTransparency="true"></iframe>';
var page_message = 'For support, news, feedback, or to request new features, become a fan of the official Better Facebook Page:<br>'+page_iframe;
var delete_img = "data:image/gif,GIF89a%15%00%15%00%F7%FF%00%FF%F4%FF%FF%F8%F9%EC%89_%DC%5B2%D85%19%DF%5DL%F3aH%E2M%2C%DDR-%D5K%1D%A32%0F%E6Y%3E%E6V%2B%E2qa%FE%FE%FE%E9%3E%09%CBI%23%E6%83j%EAR2%DBb%3B%E2c4%DES3%E9iN%FC%FD%FF%D8%2C%05%CCR)%E2%5DA%E8pK%DBkD%F8%FF%FF%F6%FE%FF%ECK%14%CF%3C%0B%FB%FD%FA%FC%FF%FF%ED%7Bi%B5%2C%03%E7kI%FF%FF%FB%E2tS%DDcE%D6B%0C%DF%5D%3C%D1N%24%F3%8Bs%DBW%3C%EC%5D%3C%D9D%15%B43%13%E2V%26%E5P%1B%E4%7Db%DDZ*%AC*%04%A8.%13%EDlT%E6nV%FF%FF%FD%FF%FF%F8%E2sZ%E6L%16%EBN%23%E6bB%E5b%3C%D9F%1A%E2Z6%AB%3C%22%EAa3%FC%FC%FB%B12%19%E6Q2%E2N'%FD%FF%F9%AD9%1E%E4M%18%E9%7Fb%E3J%0D%E7xe%BA%25%06%E3cA%FF%FD%FD%FF%FB%FD%FD%FF%F3%E6rZ%E9jG%E4L%1C%E3N%23%FF%FD%FF%FF%FC%FF%FF%FB%FF%FF%F9%FF%FB%FF%FF%FF%FF%F4%FB%FF%FD%FF%FD%FE%FF%FF%DE%EE%5CC%EAQ%25%EB%88k%E1S%3D%E5%5DM%D7B%17%ED%A2%83%DAD%2B%E9N0%B0.%0C%EA%B2%99%E1%3F%18%DE%60-%E6cG%CEF%1E%E2%8Cq%D80%01%DD8%00%E0V%17%ED%A4%91%EB%AB%90%A5%3F%17%AE7%19%F9%89u%E6jR%E4%80q%F0WO%F7%FF%FE%B2D%2B%A9%26%00%ED%96x%E2t%5D%E4I%18%E9M%1C%EEYC%E0K%23%E3W6%CF%40%16%E5%60M%E0dL%DDt%5E%E1iD%E4%5D%25%EBZ-%E3G)%E8%60F%D2A%22%FCh%5E%D8D%1F%E9bN%DFO*%EByU%F6td%C8%3D%20%E7%90t%ED%90q%FF%FA%F1%F0g%40%FF%FB%F5%DBK3%FF%FC%F9%FF%FD%FA%E0C%18%E6%88l%EB%82b%EA%82i%EEgT%E4v%5B%EDy%60%EE%80a%EF%7Cg%EB%EF%FB%E2fB%E2fG%DCnU%F3%C0%95%E7fF%F9%FF%FD%E8v%5C%DF%EE%F4%EA%E6%FD%D70%03%E1%7FR%D38%0C%EDpP%D96%0B%ED%8F%83%DD8%0B%EE%C5%C1%EAQ%17%F4%CE%C1%EF%A6%9D%F6%FC%FA%A36%15%DF%8Fx%AE4%11%F2%D2%DD%F8%B8%B8%E1G%0B%B20%11%ECA%0D%EEI%0F%E0iS%E8j%5E%E0nS%C5)%03%E6nS%F7%FF%F2%EA%89v%E8nI%EBpN%EClM%A8%40%25%DFrS%B10%08%FF%DA%DF%A2%20%00%EEwa%EBa%22%AE-%0E%E8%90x%B2Q1%ED%92%7F%EC%94%7C%DFW%1D%DCK%1E%E0uY%D5Z1%F6%CA%E1%FC%D3%E3%DDjK%E0N%1F%E7fQ%F1%9B%84%F2%9F%8F%FC%FC%F2%FF%FD%F0%E7%5D%40%F5q%5C%EF_D%E6E%11%E4M%20%E7P)%E6T%23%E1R2%E9sY%E8v%5B%E2%5C%13%EEwY%E1F0%E3M4%F5%FE%FF%E0i%3F%D9A%02%F3%5BD%EDh%3B%CEJ%1A%FF%FE%FF%FF%FF%FF%FF%FF%FF!%F9%04%01%00%00%FF%00%2C%00%00%00%00%15%00%15%00%00%08%FF%00%FF%FD%3B%D5o%0B%00%1D%FD%FA%5D%F0%D7%C1%1F%2F%11%0E%FC%E5%B8%22%F0%DF4lMN%882D%26%92%86t%DF%5CH%40%20%C1%5D%99%0C%E1%FEu%B94g%97%1FK%BE%22%CCX%B2d%94%ABx%D1%C4%15%18%E0%26%1B%2C%2C%23%E8%A81%C3%E2%0E%A8R%A5f%8C%F83%E5Y3%1F%84%CE%FC%0A%20B%5E9s%DBX%E415%C9%19%AD%12%CF%D6qH%A7%A1%C2%A6%5E%FDZm%D0f%8B%99.%24%7F%10%91%D3%C7%A1E%81%2F%C1%DC%D1X!%24%CB%15%3Co%04%7C%F2%D7%AF%83%85T((%8C%D9%B3%C7%81%91%0A%2B%92%F4%F3%D2(%94%98%3CM%88D%C9%91N%8F%91~%9A%02%208%80%80o%3F%1D%16%9A%D0%AB%F6%C8%5B%0E%0F%5C%D888w%A5%5B%A0%23%92%22%7B!%A2b%07%25Y%3Bv%18%CB%A1%C5%C1%96%0B%0Cz0%B2r%24%81%1D%7F%7B%82%1C%3BA%0A%C7%8D%7D%A8%3ALf%10%03%8D%8CvV%12%14%FD%F1%D7%C9%DE%8D)%AA%9C%E1%40%86%C5%DF%15%24%FD%B8%C5%F8%D0%AE%0A%90_WL%C0C%E1C%5D%83%0D%26%5C%10%02%05%22h%81%8E%0C%3D(%01%C8%0B%C3%F8s%C18%13P%C1%8A2R%60!E%26%A9%1C%A2%C52%FD%E4%C2%03%20)%5C%E3%40%17%9E%2C%F0%84%01%26%B4%E2%05%15%99%FC0%845%98%F8U%0C%3B%B3%90%10%00%14%8C%240%01%18%B8D%81%CF%13m%24%A2%88%0B%0Cp%B2%0A%13%0F%D4R%03%14%FD%DCR%85%0A%03h%A0%82%20.%0E%B0%C8%3C%EF%84%C1%840%0F%60P%03a%04%40R%0F%02%DF%D0%D0B%051H%40%88%1C%83%14CL%3Eq%C0A%8D%0E%AF%40%40%40%25%908%02A%02%10%00%C1O!k%A4%00%02%08%B1%60%90%0C4%F7%FC%03%0C%1F%0A%D80%0C%0C6%14%A1%00%0Ci%90%20%8D%13N%90%D0G%1D%E0Tt%05%17X%88%80%85%0E%178%B0%87%7BHt%B0%07%16X%BC%22P%40%00%3B";
var up_img = "data:image/gif,GIF89a%15%00%14%00%E6%00%00%F8%F8%F8%F3%F3%F3%E6%E6%E6%EA%EA%EA%E8%E8%E8%F9%F9%F9%E9%E9%E9%F5%F5%F5qqq%DC%DC%DC%9B%9B%9Bvvv%DB%DB%DB%7B%7B%7BZZZlllmmm~~~%B3%B3%B3%B4%B4%B4%C3%C3%C3%9A%9A%9Ahhh%9D%9D%9Ddddrrr%98%98%98%A2%A2%A2%A8%A8%A8%EF%EF%EFaaa%AA%AA%AA%97%97%97%D2%D2%D2%A0%A0%A0%94%94%94%D0%D0%D0%FE%FF%FE%F6%F6%F6%FC%FC%FC%F4%F4%F4%CC%CC%CC%FD%FE%FD%5C%5C%5C%92%92%92%8F%8F%8F%A6%A6%A6%91%91%91%A7%A7%A7%A3%A3%A3%8E%8E%8E%F1%F1%F1%D9%D9%D9%A9%A9%A9MMM%DA%DA%DAEEESSSbbb%D8%D8%D8%5E%5E%5EzzzpppUUUtttgggsss___fffIIIxxx%DD%DD%DDcccPPP%E7%E7%E7%EB%EB%EB%CA%CA%CA%EC%EC%EC%AC%AC%AC%8C%8C%8C%E4%E4%E4%E5%E5%E5%ED%ED%ED%E3%E3%E3%EE%EE%EE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%00%00%00%00%00%2C%00%00%00%00%15%00%14%00%00%07%FF%80!%13N%84%85%86%87%84%13!%12%24%07U%8F%90%91%92%07%24%12%1F%073T%9A%9B%9C%9A%1D%1DT3%07%1F5U%9D%A7%A7U50URTR%B0%B1%B2%B0%AFRU0.UM%B1M%BD%0C%0B%0C%BD%B0%BBMU.1%25K%BDM%CA%0C%0E8D%09%CC%CA%BD%251%1B*KK%03%DA4%2BE%3F%2B%3EG%DA%E5*%1B%22'%03%06%03%037C6%0E%18A%18%40%09%ED%ED'%22%17%05%06%FE4%1E%92%F0%B0%F0%A0%A0%05%23%09%FC%11(pA%01%00%02%04v%20%C9%A1%03%02%82%8B%17!%F4%60%00%11%80%02%0D%07%94%88%24%60%A2%00%04!%0BR%16Xi%82%80%92%03%1A%40%A0%10%20R%80M%0F%19%1A%E8%2C%40S%09M%14%20F%04%88B4%8A%80(%0E2DX%0A%C0h%D1%00%23X%0C-J%14%0A%80%ABW%A9F%09%C0%E2E%00(S%A0%88%1DK6%EC%D8%00%2FZ%04%98%C2%B6%AD%5B%B6%60(%C5N%09%D0B%86%92%04o%F3%BAM%A0D%86%02%0E%14%98%08%1EL%B80%05%0E%0ARTx%C2%B8%B1%E3%C7%8C%2B%A4%08%04%00%3B";
var down_img = "data:image/gif,GIF89a%15%00%14%00%E6%00%00%F5%F5%F5%F3%F3%F3%E6%E6%E6%E9%E9%E9%E8%E8%E8qqqBBB%DA%DA%DA%9B%9B%9B%EA%EA%EA%F6%F6%F6%8F%8F%8F%DB%DB%DBvvv%EF%EF%EFlllhhhVVVcccRRR%AA%AA%AA%F1%F1%F1%98%98%98%B4%B4%B4%A2%A2%A2%FD%FE%FD%97%97%97%F9%F9%F9%94%94%94%9D%9D%9D%C3%C3%C3%F4%F4%F4%A0%A0%A0%D2%D2%D2%CC%CC%CC%D0%D0%D0%FE%FF%FE%B3%B3%B3%FC%FC%FC%DC%DC%DC%A9%A9%A9GGG%A3%A3%A3%8E%8E%8E%A7%A7%A7aaaiii%A8%A8%A8%92%92%92%A6%A6%A6ddd%91%91%91%9A%9A%9A%F8%F8%F8%FA%FA%FAmmm___%87%87%87%5E%5E%5E%F2%F2%F2OOO%8B%8B%8B%7C%7C%7C%82%82%82%3C%3C%3CJJJooo%40%40%40ZZZzzz~~~%99%99%99%EC%EC%EC%CA%CA%CA%EB%EB%EB%AC%AC%AC%8C%8C%8C%E7%E7%E7%E4%E4%E4%ED%ED%ED%E5%E5%E5%EE%EE%EE%E3%E3%E3%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%00%00%00%00%00%2C%00%00%00%00%15%00%14%00%00%07%FF%80!%17K%84%85%86%87%84%17!%25%23%00S%8F%90%91%92%00%23%25%14%00%15Q%9A%0EQ%9C%9A%9F%9E%15%00%14(S%9F%A7%A8%A8S(%2CSOQO%B1%AF%B2%B4%B2S%2C1SH%B1H%BB%40C%06%C1%BC%BCS1*%24J%BDHJJ%06%3C%11%D06%BD%C9H%24*%18%19%CC%DAJ)D%12%DF6%DBJ%19%18%20%26%09%03%078)A%13-%10%F0-%132%07%09%09%26%20%1D%1B%03%FC%0CB%3A2%5C%3C%18%E8%C2G%02%05%03%08l%E8%80%A0%06%81%87%03%18%14%B9Q%A0b%81%1CJ%10%26%AC%81%C0%02%80%26%20A20R%A0A%83%1EH%14%10%08%09%C0%82%86%0F%02%9A%C4%8Cy%E0G%83%05H%00%AC%0C%F9A%03%87%00P%A0%08%08%1A%F4%C0%91%9CC%85%06%0D%C0%01%06P(N%88%06%15%B0%23%A9%D4%000f%04p%22E%8A%93%AF%60%C3%86%0D0cA%80%AE%5D%B9%A2%F5%CA%16m%80%05%2B%22%9A%9CXK%B7%EE%89%26%2B%10%BC%F0%90%A4%AF%DF%BF%80%3D%BC%40%20%82%06%93%C3%88%13%2B%3ELCD%20%00%3B";
var close_img="data:image/gif,GIF89a%13%00%13%00%F7%00%00%FF%F4%FF%FF%F8%F9%EC%89_%DC%5B2%D85%19%DF%5DL%F3aH%E2M%2C%DDR-%D5K%1D%A32%0F%E6Y%3E%E6V%2B%E2qa%FE%FE%FE%E9%3E%09%CBI%23%E6%83j%EAR2%DBb%3B%E2c4%DES3%E9iN%FC%FD%FF%D8%2C%05%CCR)%E2%5DA%E8pK%DBkD%F8%FF%FF%F6%FE%FF%ECK%14%CF%3C%0B%FB%FD%FA%FC%FF%FF%ED%7Bi%B5%2C%03%E7kI%FF%FF%FB%E2tS%DDcE%D6B%0C%DF%5D%3C%D1N%24%F3%8Bs%DBW%3C%EC%5D%3C%D9D%15%B43%13%E2V%26%E5P%1B%E4%7Db%DDZ*%AC*%04%A8.%13%EDlT%E6nV%FF%FF%FD%FF%FF%F8%E2sZ%E6L%16%EBN%23%E6bB%E5b%3C%D9F%1A%E2Z6%AB%3C%22%EAa3%FC%FC%FB%B12%19%E6Q2%E2N'%FD%FF%F9%AD9%1E%E4M%18%E9%7Fb%E3J%0D%E7xe%BA%25%06%E3cA%FF%FD%FD%FF%FB%FD%FD%FF%F3%E6rZ%E9jG%E4L%1C%E3N%23%FF%FD%FF%FF%FC%FF%FF%FB%FF%FF%F9%FF%FB%FF%FF%FF%FF%F4%FB%FF%FD%FF%FD%FE%FF%FF%DE%EE%5CC%EAQ%25%EB%88k%E1S%3D%E5%5DM%D7B%17%ED%A2%83%DAD%2B%E9N0%B0.%0C%EA%B2%99%E1%3F%18%DE%60-%E6cG%CEF%1E%E2%8Cq%D80%01%DD8%00%E0V%17%ED%A4%91%EB%AB%90%A5%3F%17%AE7%19%F9%89u%E6jR%E4%80q%F0WO%F7%FF%FE%B2D%2B%A9%26%00%ED%96x%E2t%5D%E4I%18%E9M%1C%EEYC%E0K%23%E3W6%CF%40%16%E5%60M%E0dL%DDt%5E%E1iD%E4%5D%25%EBZ-%E3G)%E8%60F%D2A%22%FCh%5E%D8D%1F%E9bN%DFO*%EByU%F6td%C8%3D%20%E7%90t%ED%90q%FF%FA%F1%F0g%40%FF%FB%F5%DBK3%FF%FC%F9%FF%FD%FA%E0C%18%E6%88l%EB%82b%EA%82i%EEgT%E4v%5B%EDy%60%EE%80a%EF%7Cg%EB%EF%FB%E2fB%E2fG%DCnU%F3%C0%95%E7fF%F9%FF%FD%E8v%5C%DF%EE%F4%EA%E6%FD%D70%03%E1%7FR%D38%0C%EDpP%D96%0B%ED%8F%83%DD8%0B%EE%C5%C1%EAQ%17%F4%CE%C1%EF%A6%9D%F6%FC%FA%A36%15%DF%8Fx%AE4%11%F2%D2%DD%F8%B8%B8%E1G%0B%B20%11%ECA%0D%EEI%0F%E0iS%E8j%5E%E0nS%C5)%03%E6nS%F7%FF%F2%EA%89v%E8nI%EBpN%EClM%A8%40%25%DFrS%B10%08%FF%DA%DF%A2%20%00%EEwa%EBa%22%AE-%0E%E8%90x%B2Q1%ED%92%7F%EC%94%7C%DFW%1D%DCK%1E%E0uY%D5Z1%F6%CA%E1%FC%D3%E3%DDjK%E0N%1F%E7fQ%F1%9B%84%F2%9F%8F%FC%FC%F2%FF%FD%F0%E7%5D%40%F5q%5C%EF_D%E6E%11%E4M%20%E7P)%E6T%23%E1R2%E9sY%E8v%5B%E2%5C%13%EEwY%E1F0%E3M4%F5%FE%FF%E0i%3F%D9A%02%F3%5BD%EDh%3B%CEJ%1A%FF%FE%FF%FF%FF%FF%FF%FF%FF!%F9%04%00%00%00%00%00%2C%00%00%00%00%13%00%13%00%07%08%FF%00%A7akrB%94!2%914%A4%FB%E6B%02%02%09%EE%CAd%08wi%CE.%3F%96%7CE%98%B1d%C9(W%F1%A2%89%2B0%C0M%B6%11t%D4%98aq%07T%A9R3F%FC%99%F2%AC%99%0FBg~%C9%2Bgn%1B%8B%3C%A6%269%A3U%E2%D9%3A%0E%E94T%D8%D4k%836%5B%CCt!%F9%83%88%9C%3E%0E-%0A%7C%09%E6%8E%C6%0A!x%DE%08%F8%E4%AF_%07%0B%A9PP%18%B3g%8F%03%23%15V%24i%14JL%9E%26D%A2%E4H%A7%C7H%3FM%01%10%1C%40%F0%D5B%13z%D5%1Ey%CB%E1%81%0B%1B%07%E7%AEt%0BtD%92%5C%15%3B(%C9%DA%B1%C3X%0E-%0E%B6%5C%60%D0%83%91%95%23%09%EC%049v%82%14%8E%1B%FBPu%E8%E7%85A%0C42%DAYIP%C4%DE%8D)%AA%9C%E1%40%86%C5%DF%15%24%FD%B8%C5%F8%D0%AE%0A%90_%F0P%F8P%D7%60%83%89%0B!(%88%D0%82NF%0F%25%80%5E%0C%A3%1B7%81%0A%2BeR%B0H%C9%94%EA%90%96e%FDr%F1%00%94%E2%9A%A7%05O%0C%98h%E5%85J%A6%1FCX%83I%16W%14%C3%CE%2C%240%92%C0%04%60%E0%12%05%3EO%B4%91%88%22.0%C0%C9*L%3CPK%0D%B7T%A1%C2%00%1A%A8%20%08%80%03%2C2%CF%3Ba0!%CC%03%18%D4%40%00%24%F5%20%F0%0D%0D-T%10%83%04%84%C81H1%C4%E4%13%07%1C%D4%40%40%40%25%908%02A%02%10%00%C1O!k%A4%00%02%08%B1%60%90%0C4%C0%F0%A1%80%0D%C3%C0%60C%11%0A%C0%90%06%09%D28%E1%04%09%7D%D4%01N%40%00%3B";

// ==================================================================
// UTILITY functions
// ==================================================================
function htmlescape(str) { if(typeof str=="string") { return str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,"&quot;"); } return ""; }
function parse(str,desc) { try { return JSON.parse(str); } catch (e) { showerror('Invalid JSON data! ['+desc+']',str); return {}; } }
function _template(s) {if (PERFORMANCE) { trace_start(arguments.callee); }for (var i=1; i<arguments.length; i++) {var arg = arguments[i];if ("object"==typeof arg) { for (var key in arg) { var val = arg[key]; if (typeof val=='undefined') {val = '';} s = s.replace( new RegExp("%"+key+"%","g"),val); } }		else { s = s.replace( new RegExp("%"+i+"%","g"),arg); }	}if (PERFORMANCE) { trace_end(arguments.callee); }	return s;}
var convert_string_to_regex_matches = {};
function convert_string_to_regex(str) {if (typeof convert_string_to_regex_matches[str]!="undefined") { return convert_string_to_regex_matches[str]; }try {var matches = str.match(/^\/(.*?)\/(\w*)$/);var re = new RegExp(matches[1],matches[2]);convert_string_to_regex_matches[str] = re;return re;}	catch(e) { showerror("Invalid regular expression:"+str); convert_string_to_regex_matches[str] = null; return null; }}
function trim(str) { if (str.trim) { return str.trim(); } return str.replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g,""); }
function $(id) { return document.getElementById(id); }
function $first(o,cn,func) {if(!o){return;} if (o && o.getElementsByClassName) { var cns = o.getElementsByClassName(cn); if (cns && cns.length) { if(func) { func(cns[0],o); }; return cns[0]; } } return null; }
function $$(cn,func,context) { $each((context||document).getElementsByClassName(cn),func); }
function $each(els,func){ if (els && els.length) { if (typeof func=="string") { func = new Function(func); } for (var i=els.length-1; i>=0; i--) { func.call(els[i]); } } }
function $tagname(o,tagname,func) { if(!o){return;}$each(o.getElementsByTagName(tagname),func); }
function bind(el,ev,func) { if (typeof el=="string") { el = $(el); } if (typeof func=="string") { func = new Function(func); } if (el && el.addEventListener) { el.addEventListener(ev,func,false); } }
function toggle(o,default_open_option) {if (typeof o=="string") { o=$(o); }if (o && o.style) {var closed = (o.style.display=="none");o.style.display = closed?"":"none";if (default_open_option) {options.set(default_open_option,closed);}}}
function setValue(key,val,func) { var do_set=function() { try { GM_setValue(key,val); } catch(e) { showexception(e); } if(func) { func(key,val); } };if (is_chrome) {do_set();}else {window.setTimeout(do_set,0);}}
function getValue(key, def) {return GM_getValue(key,def);}
function hasClass(o,re) {if (typeof re=="string") {re = new RegExp("(^|\\s)"+re+"(\\s|$)");}return (o.className && re.test(o.className));}
function addClass(o,cn) {if(!o){return;}if (o.className==null || o.className=='') { o.className = cn; return;}if (hasClass(o,cn)) { return; }o.className = o.className + " " + cn; }
function removeClass(o,re) {if(!o){return;} if (!hasClass(o,re)) { return; } if (typeof re=="string") { re = new RegExp("(^|\\s)"+re+"(\\s|$)"); } o.className = o.className.replace(re,' '); };
function toggleClass(o,cn) {if(!o){return;} if(hasClass(o,cn)) { removeClass(o,cn); } else { addClass(o,cn); } }
function getParentByClass(el,cn){ if (hasClass(el,cn)){return el;} while(el=el.parentNode) { if(hasClass(el,cn)) { return el; } }; return null; }
function parentChain(o){var s="";while(o){s+=outerHTML(o);o=o.parentNode;}return s;}
function outerHTML(o,esc){if(!o || !o.tagName){return (esc?"&lt;&gt;":"<>");}return (esc?"&lt;":"<")+o.tagName+(o.id?" id="+o.id:"")+(o.className?" class="+o.className:"")+(esc?"&gt;":">");}
function prev(o,tag){if(!o){return;}while(o=o.previousSibling){if(o.tagName==tag){return o;}}return null;}
function next(o,tag){if(!o){return;}while(o=o.nextSibling){if(o.tagName==tag){return o;}}return null;}
function css(el,rules){rules.split(/\s*;\s*/).foreach(function(){ var keyval=this.split(':'); el.style[keyval[0]]=keyval[1]; });}
function removeChild(o){if(o&&o.parentNode&&o.parentNode.removeChild){o.parentNode.removeChild(o);}}
function QS(o,query,prop){if(!o||!o.querySelector){return null;}var m=o.querySelector(query);if(!m){return null;}if(typeof prop=="undefined"){return m;}return m[prop];}
function QSA(o,query,func){if(!o||!o.querySelectorAll){return null;}var m=o.querySelectorAll(query);if(!m||m.length==0){return null;}if(typeof func!="function"){return m;}for(var i=0;i<m.length;i++){func(m[i]);}return m;}
var clickLinkQueue = [];
var clickLinkQueueTimer = null;
var clickLinkQueueDelay = options.get('expand_similar_posts_delay') || 1000;
function clickLinkQueued(el) {
	if (clickLinkQueueTimer==null || (!el && clickLinkQueue.length>0)) {
		trace("Clicking link to expand similar posts. Will check back in "+clickLinkQueueDelay+" ms");
		if (!el) { el = clickLinkQueue.pop(); }
		el.style.backgroundColor="red";
		clickLink(el);
		clickLinkQueueTimer = setTimeout( function() { clickLinkQueued(); }, clickLinkQueueDelay);
	}
	else if (el) { clickLinkQueue.push(el); trace("Added link to queue. Queue length is now:"+clickLinkQueue.length); }
	else { clickLinkQueueTimer = null; trace("Nothing more to do in the click link queue"); }
};
function clickLink(el) {var e = document.createEvent('MouseEvents');e.initEvent('click',true,true,window,0);el.dispatchEvent(e);}
// Trigger a function when an element with a certain ID is added to the document
function onIdLoad(id,func,watch_stream) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var o = document.getElementById(id);
	if (o) { func(o,id,o); } // Call it right away if it already exists
	watchDOMNodeInserted('#'+id,func,watch_stream);
	if (PERFORMANCE) { trace_end(arguments.callee); }
}
// Trigger a function when elements matching a selector is added to the document
function onSelectorLoad(selector,func,watch_stream) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var els = document.querySelectorAll(selector);
	if (els && els.length) { // Call it right away if it already exists
		for (var i=0; i<els.length; i++) {
			func(els[i],selector);
		}
	} 
	watchDOMNodeInserted(selector,func,watch_stream);
	if (PERFORMANCE) { trace_end(arguments.callee); }
}
// Trigger a function when the page unloads (when the user navigates away from the current view)
var onunloadhandlers = [];
function onUnload(func) {
	onunloadhandlers.push(func);
}
// Fire the functions when unload happens
function unload() {
	for (var i=0; i<onunloadhandlers.length; i++) {
		onunloadhandlers[i]();
	}
	onunloadhandlers.length = 0;
	// Reset counters
	uniqueStories = {};
	nofbidcount = 0;
	storyCount = 0;
	count_processed = 0;
	count_hidden = 0;
	count_filtered = 0;
	count_tabbed = 0;
	count_expanded = 0;
	count_duplicate = 0;
	olderPostsClickCount = 0;
}
/* Trigger a function when an element exists and has content */
function onElementContent(id,func,doc,delay,count) {
	delay = delay || 500;
	doc = doc || document;
	count= count||0;
	var o = doc.getElementById(id);
	if (o==null || !o.childNodes || o.childNodes.length==0) {if (count++>30) {func(null);}else {setTimeout( function() { onElementContent(id,func,doc,delay,count) } ,delay);}}
	else {func(o);}
}
// Add CSS to the page
function addGlobalStyle(css) {if (PERFORMANCE) { trace_start(arguments.callee); }GM_addStyle(css);if (PERFORMANCE) { trace_end(arguments.callee); }}
function insertStylesheet(url,id) { var link = el("link",null,{rel:"stylesheet",type:"text/css",href:url}); if(id){link.id=id;} document.getElementsByTagName("head")[0].appendChild(link); trace("Inserted stylesheet:"+url);}

// Mutation functions
// These set an internal flag to denote that we are doing the mutating, so the DOMNodeInserted handlers don't fire
function append(to,el){if(PERFORMANCE){trace_start(arguments.callee);}if(to&&to.appendChild){ internalUpdate=true; to.appendChild(el); internalUpdate=false; }; if(PERFORMANCE){trace_end(arguments.callee);}}
function insertBefore(el,ref){if(PERFORMANCE){trace_start(arguments.callee);}internalUpdate=true; if(ref&&ref.parentNode){ref.parentNode.insertBefore(el,ref); internalUpdate=false;}if(PERFORMANCE){trace_end(arguments.callee);}};
function html(el,h){if(PERFORMANCE){trace_start(arguments.callee);}internalUpdate=true; if(el){el.innerHTML=h;} internalUpdate=false;if(PERFORMANCE){trace_end(arguments.callee);}}
function appendhtml(el,h){if(PERFORMANCE){trace_start(arguments.callee);}internalUpdate=true; if(el&&h){el.innerHTML+=h;} internalUpdate=false;if(PERFORMANCE){trace_end(arguments.callee);}}

function insertFirst(container,el) {if(PERFORMANCE){trace_start(arguments.callee);} insertAtPosition(container,el,1); if(PERFORMANCE){trace_end(arguments.callee);}}
function insertAtPosition(container,el,pos) {if(PERFORMANCE){trace_start(arguments.callee);} if (pos<1) { pos=1; } if (container && container.childNodes && container.childNodes.length>pos-1) { insertBefore(el, container.childNodes[pos-1]); } else { append(container,el); } if(PERFORMANCE){trace_end(arguments.callee);}}
function insertAfter(el,ref) { if(PERFORMANCE){trace_start(arguments.callee);}var container, ns; if ( (container=ref.parentNode) && (ns=ref.nextSibling) ) { insertBefore(el, ns); } else if (container) { append(container,el); } if(PERFORMANCE){trace_end(arguments.callee);}}

// ==================================================================
// ELEMENT CREATION
// ==================================================================
// Create an element and attach class name, properties and events
function el(type,cn,props,events,innerHTML) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var o = document.createElement(type);
	if (cn) { o.className=cn; }
	if (props) {for (var i in props) {o[i] = props[i];}}
	if (events) {for (var i in events) {o.addEventListener(i,events[i],false);}}
	if (innerHTML) {html(o,innerHTML);}
	if (PERFORMANCE) { trace_end(arguments.callee); }
	return o;
}
function button(value,onclick,id) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var button = el( 'input','',{type:'button','value':value},{click:onclick} );
	var span = el('label','uiButton UIButton UIButton_Blue UIFormButton UIButton_better_fb',{'id':id});
	append(span,button);
	if (PERFORMANCE) { trace_end(arguments.callee); }
	return span;
}
function minimessage(str,okFunc) {
	okFunc = okFunc || (function(){});
	return el('div','better_fb_mini_message',{innerHTML:str,title:'Click to close message'},{click:function() { okFunc(); this.style.display='none'; }} );
}
function message(str,okFunc,obj) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var msg = el('div','better_fb_message');
	html( msg, '<div class="better_fb_bulb_spacer"></div>'+str );
	if (obj) { append(msg,obj); }
	okFunc = okFunc || (function(){});
	var ok = el('span','better_fb_close',{innerHTML:'OK'},{click:function() { okFunc(); this.parentNode.parentNode.style.display='none'; } } );
	var ok_wrap = el('div','bfb_close_wrap');
	append(ok_wrap,ok);
	append(msg,ok_wrap);
	append(msg,el('div','bf_clear'));
	if (PERFORMANCE) { trace_end(arguments.callee); }
	return msg;
}

// ==================================================================
// REMOTE CONTENT
// ==================================================================
var protocol = "http:";
var host = "facebook.com";
try { protocol = location.protocol; } catch(e) { } 
try { host = location.host; } catch(e) { }
var remote_content = {
	typeahead: { type:'xhr', url:protocol+'//'+host+'/ajax/typeahead_search.php?__a=1', headers:{'Content-type':'application/x-www-form-urlencoded'}, ttl:options.get('friend_tracker_interval')*3600 }
	,friend_lists: { type:'xhr', url:protocol+'//'+host+'/friends/ajax/superfriends.php?__a=1&all_lists=true', headers:{'Content-type':'application/x-www-form-urlencoded'}, ttl:options.get('friend_list_interval')*3600 }
	,group_activity: { type:'iframe', url:protocol+'//'+host+'/groups.php', ttl: options.get('group_activity_interval')*3600 }
	,friend_activity: { type:'iframe', url:protocol+'//'+host+'/?sk=ru', ttil: options.get('friend_activity_interval')*3600 }
	,version_info: { type:'xhr', url:'http://betterfacebook.net/version.json', ttl:0 }
	,donate: { type:'xhr', url:'http://betterfacebook.net/donate.msg', ttl:0 }
}
function get_remote_content(type,func,ref,force_refresh) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var rc = remote_content[type], response;
	if (rc) {
		// First check the cache!
		var type_key = userid+"/"+type;
		var last_check_prop = type_key+'/last_check';
		var last_check = +getValue(last_check_prop,0);
		var cache = getValue(type_key,null);
		var t = time();
		if (!force_refresh && cache && ( (t-last_check) <= (rc.ttl*1000)) ) {
			// Use cached content!
			trace("Using cached content for type:"+type);
			func(cache);
		} else {
			if (typeof rc.queue=="undefined") { rc.queue=[]; }
			// Add the func to the queue
			rc.queue.push(func);
			trace("Refreshing cached content for type:"+type);
			// Only start loading if it's not already been started
			if (typeof rc.loading=="undefined" || !rc.loading) {
				rc.loading = true;

				// Get new content
				if (rc.type=='xhr') {
					var headers = rc.headers || {}; headers['Cache-Control']='no-cache';
					var method = rc.method || 'GET';
					var url = rc.url;
					url += (url.indexOf('?')>0?'&':'?')+'time='+t;
					try {
						GM_xmlhttpRequest({'method':method,'headers':headers,'url':url,'onload':function(res) { 
							rc.loading = false;
							if (res.responseText==null || res.responseText=="") {
//								showerror("No response received for remote content: "+type);
								return;
							}
							// Call each queued function
							var save_value = true;
							while (rc.queue.length) {
								var func = rc.queue.shift();
								var dosave = func(res.responseText); 
								if (dosave===false) {
									save_value=false;
								}
							}
							if (save_value) {
								setValue(last_check_prop,""+t);
								setValue(type_key,res.responseText);
							}
						}});
					} catch(e) {
						showerror('An error occurred while trying to retrieve remote data from url: <a href="'+url+'">'+url+'</a>. The error is:<br>'+e.toString());
					}
				}
				else if (rc.type=='iframe') {
					var iframe = el("iframe",null,{src:rc.url});
					iframe.style.display="none";
					iframe.addEventListener('load',function(e) {
						try {
							rc.loading = false;
							var doc = e.target.contentDocument;
							setValue(last_check_prop,""+t);
							var val = null;
							while (rc.queue.length) {
								var func = rc.queue.shift();
								val = func(doc);
							}
							if (val!=null) {
								setValue(type_key,""+val);
							}
							if (iframe && iframe.parentNode) { iframe.parentNode.removeChild(iframe); }
						}
						catch (e) { showexception(e); }
					},false);
					append(ref,iframe);
				}
			}
		}
	}
	if (PERFORMANCE) { trace_end(arguments.callee); }
}
function load_remote_content(type,ref,func,loading_msg,empty_msg,force_refresh) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	if (loading_msg) { html(ref,loading_msg); }
	get_remote_content(type,function(res) {
		var content = func(res) || empty_msg;
		html(ref,content);
		if (PERFORMANCE) { trace_end(arguments.callee); }
		return content;
	},ref,force_refresh);
	if (PERFORMANCE) { trace_end(arguments.callee); }
}
function fetch_content_in_iframe(url,id,func) {
	var iframe = el("iframe",null,{src:url});
	iframe.style.visibility="hidden";
	iframe.style.position="absolute";
	iframe.addEventListener('load',function(e) {
		try {
			var doc = e.target.contentDocument || e.target.contentWindow.document;
			var check = function() {
				var el = doc.getElementById(id);
				if (el) { 
					func(el); 
					el=null; doc=null; iframe.src = null;
					if (iframe && iframe.parentNode) { iframe.parentNode.removeChild(iframe); }
					iframe=null;
				}
				else { setTimeout(check,200); }
			}
			check();
		}
		catch (e) { showexception(e); }
	},false);
	append(document.body,iframe);
}
function get_friend_lists(func) {
	get_remote_content('friend_lists', function(result) {
		var friend_lists = parse(result.substring(9),"Friend Lists");
		if (!friend_lists.payload || !friend_lists.payload.collections) { 
			func(null); 
			return false; 
		}
		return func(friend_lists.payload.collections);
	});
}


// ==================================================================
// HANDLE STREAM HEADER CHANGES
// ==================================================================
// When the stream header is inserted, check to see if we are on the Most Recent feed
var forceMostRecent = true;
function updateMostRecentFeedStatus(header) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var a = header.getElementsByTagName('A');
	if (a && a[0] && a[0].href) {
		a = a[0].href;
		if (a && !/sk=lf/i.test( a ) ) {
			forceMostRecent = false;
		}
		else if (forceMostRecent && options && options.get('force_most_recent_feed')) {
			// If not most recent feed, go there!
			window.location.href = a;
		}
	}
	if (PERFORMANCE) { trace_end(arguments.callee); }
}
onIdLoad("pagelet_stream_header",function(header) { 
	updateMostRecentFeedStatus(header);
	header.addEventListener('DOMSubtreeModified',function(e) { updateMostRecentFeedStatus(e.target); },false);
});

// ==================================================================
// Insert a character counter in status update boxes
// ==================================================================
(function() {
	if (options.get('show_char_counter')) {
		var counter = null;
		document.addEventListener('keyup',function(e) {
			var d = e.target;
			if (d && (hasClass(d,"Mentions_Input") || hasClass(d,"mentionsTextarea"))) {
				if (counter==null) {
					counter = el('div','bfb_char_count');
					d.parentNode.appendChild(counter);
				}
				if (counter!=null) {
					if (hasClass(d,"mentionsTextarea")) {
						counter.innerHTML = d.value.length;
					}
					else {
						counter.innerHTML = d.innerHTML.length-4;
					}
				}
			}
		},true);
	}
})();

// ==================================================================
// GENERAL POPUP DIALOG
// ==================================================================
function show_dialog(content,header,okfunc,footer_content) {
	var dialog = el('div','bfb_dialog');
	var dialog_content = el('div','bfb_dialog_content');
	if (header) {
		append(dialog,el('div','bfb_dialog_header',null,null,header));
	}
	if (typeof content=="string") { html(dialog_content,content); }
	else { append(dialog_content,html); }
	append(dialog,dialog_content);
	var footer = el('div','bfb_dialog_footer');
	if (footer_content) {
		if (typeof footer_content=="string") { html(footer,footer_content); }
		else { append(footer,footer_content); }
	}
	else {
		append(footer,button('OK',function(){ if(okfunc) { okfunc(); } removeChild(dialog); },'better_fb_close'));
	}
	append(dialog,footer);
	append(document.body,dialog);
}

// ==================================================================
// HELP DIALOG
// ==================================================================
function show_help() {
	var help = el('div','bfb_help_wrapper',null,null,'<iframe id="bfb_help_iframe" src="http://BetterFacebook.net/help.php"></iframe>');
	help.id = 'bfb_help_wrapper';
	var max_height = (window.innerHeight-150);
	help.style.height = max_height+"px";
	append(help,button('     Close Help     ',function(){$('bfb_help_wrapper').parentNode.removeChild($('bfb_help_wrapper'));},'bfb_help_close'));
	append(document.body,help);
	$('bfb_help_iframe').style.height = (max_height-70)+"px";
}

// ==================================================================
// WELCOME MESSAGE
// ==================================================================
if (options && options.get('highlight_cp')) {
	var msg = '<p><b>Read these notes before continuing</b>, so you know what Better Facebook can do for you!</p>		\n'+
'			<p>Click <b>\'Mark All Read\'</b> once you have read every story on this page. The stories will then be hidden the next time you view the page. But don\'t worry - if any new comments are added they will show back up! This will let you keep track of conversations that you otherwise might have missed.</p>\n'+
'			<p>You can always go back and see all the hidden stories by clicking <b>\'Show/Hide All\'</b>.</p>		\n'+
'			<p>By default, all <b>posts by known applications have been moved to their own tabs</b>. You can change this in Options-&gt;Feed Filter.</p>\n'+
'			<p>You can change options for your Facebook page by clicking the <b>\'Options\' button in the header</b> above!</p>		\n'+
'			<p>Questions? Comments? Feedback? Bug Reports? Feature Requests? Want to know about the latest news and release? Be sure to "Like" the Better Facebook page for support!<br>'+page_iframe+
'			<p>Click OK to dismiss this message!</p>';
	show_dialog(msg,"Welcome to Better Facebook!",function() { options.set('highlight_cp',false); } );
}

// ==================================================================
// CONTROL PANEL
// ==================================================================
function createControlPanel(beforeEl) {
	trace("Creating control panel");
	var reload = function() { window.location.reload(); };
	var markAllRead = function() {
		markRead();
		if (options.get('reload_when_mark_all_read')) {
			reload();
		}
	}
	if (!$('better_fb_cp')) {
		var cp = el('fieldset','better_fb_cp',{id:'better_fb_cp'});
		append(cp, el('legend',null,null,null,'Better Facebook! ver. '+version+' ') );
		if (options.get('cp_button_mark_all_read')) { append(cp, button('Mark All Read',markAllRead,'better_fb_mark_read') ); }
		if (options.get('cp_button_show_hide_all')) { append(cp, button('Show/Hide All',toggle_show_all,'better_fb_show_hide_all') ); }
		if (options.get('cp_button_mute_all')) { append(cp, button('Mute All',mute_all,'better_fb_mute_all') ); }
		if (options.get('cp_button_reload')) { append(cp, button('Reload',reload,'better_fb_reload') ); }
		if (options.get('cp_button_help')) { append(cp, button('Help!',show_help,'bfb_button_help') ); }
		if (DEBUG) {
			append(cp, button('Toggle Debug',function(){ toggleClass(document.body,"debug"); },'better_fb_debug_button') );
			
			var lr = el('div','debug');
			var setpref = el('div',null,null,null,'Set Preference: Name:<input size=10 id="bf_setpref_name"> Value:<input size=10 id="bf_setpref_val">');
			append(setpref, el('input',null,{type:'button',value:'Save'},{click:function() { options.set($('bf_setpref_name').value,$('bf_setpref_val').value); alert('Saved');}}) );
			append(lr,setpref);
			append(cp, lr );
			
			append(cp, el('div','',{id:'better_fb_debug_console'}) );
		}
		append(cp, el('div',null,{id:'bfb_status'},null,'Processed: <span id="bfb_status_processed">0</span> Hidden: <span id="bfb_status_hidden">0</span> Filtered: <span id="bfb_status_filtered">0</span> Tabbed: <span id="bfb_status_tabbed">0</span> Dupes: <span id="bfb_status_duplicate">0</span> Expanded: <span id="bfb_status_expanded">0</span> Older Posts clicked: <span id="bfb_status_older">0</span>'));
		insertFirst( beforeEl.parentNode , cp);
		
		// Handle page scrolling to keep control panel at the top
		var originalTop = cp.offsetTop;
		var op = cp;
		while (op=op.offsetParent) {
			originalTop += op.offsetTop;
		}
		if (options.get('static_header')) {
			originalTop = originalTop - 26;
		}
		var manualOffset = +( options.get('floating_cp_offset') || 0);
		var originalWidth = cp.offsetWidth;
		if (options.get('float_control_panel')) {
			document.addEventListener('scroll', function(e) {
				if (!cp) { return; }
				var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
				if (scrollTop > originalTop) {
					addClass(cp,'bfb_cp_float');
					cp.style.top = ((scrollTop-originalTop)+manualOffset)+"px";
					cp.style.offsetWidth = originalWidth+"px";
				}
				else {
					removeClass(cp,'bfb_cp_float');
					cp.style.top = cp.style.offsetWidth = "";
				}
			},false);
		}

	}
}
var status_timeout = {};
function update_status(id,num) {
	var s = $(id);
	if (s) {
		if (status_timeout[id]) {
			clearTimeout(status_timeout[id]);
		}
		status_timeout[id] = setTimeout( function() { if (s) { s.style.color=''; } }, 2000 );
		html(s,num);
		s.style.color='red';
	}
}

// ==================================================================
// STATIC CSS
// ==================================================================
(function() {  // Wrapped for code collapsing
	var o = {};
	var zoom = +options.get('post_action_zoom')/100;
	o.floating_cp_opacity = options.get('floating_cp_opacity');
	o.post_action_opacity2 = options.get('post_action_opacity2');
	o.font_size = options.get('post_font_size');
	
	// Conditional options to add as CSS classes to the HTML tag
	var condition_options = [	
		'alternate_read_display',
		'hide_post_actions_until_hover',
		'hide_hovercard',
		'highlight_suggest_to_friends',
		'hide_connect_box',
		'hide_suggestions_box',
		'hide_events_box',
		'hide_beta_box',
		'hide_recommended_pages_box',
		'hide_pokes',
		'hide_get_connected',
		'hide_questions',
		'expand_nav_messages',
		'expand_nav_events',
		'expand_nav_photos',
		'expand_nav_friends',
		'expand_nav_friends_full',
		'highlight_cp',
		'left_align',
		'static_header',
		'static_left_col',
		'hide_update_email',
		'hide_options_icon',
		'hide_old_comments',
		'hide_notification_pictures',
		'hide_chat_panel',
		'show_friends_on_chat_when_offline',
		'pin_notifications_right_panel',
		'hide_status_updater',
		'stretch_wide'
	];
	var classes = "";
	for (var i=0; i<condition_options.length; i++) {
		if (options.get(condition_options[i])) { classes+=condition_options[i]+" "; }
	}
	if (classes) { addClass(document.getElementsByTagName('html')[0],classes); }

	// Write out the CSS to the page
	var css = ''+
'.better_fb_cp { padding:0px 5px 2px 5px; border:1px solid #ccc; margin:0px 0px 6px 0px; background-color:white; z-index:100; -moz-border-radius:5px; }'+
'.better_fb_cp legend { font-size:10px; color:#999; font-style:italic; background-color:white; }'+
'.bfb_cp_float { position:relative; z-index:14; opacity:.75; -moz-box-shadow:5px 5px 5px #999; -webkit-box-shadow:5px 5px 5px #999; border:2px solid #ccc; }'+
'.bfb_cp_float:hover { opacity:1; }'+
''+
'.bfb_new_comment_notif { display:none; }'+
'.bfb_read, .bfb_muted { display:none !important; }'+
'.bfb_read.bfb_new_comments, .bfb_read.bfb_new_comments .bfb_new_comment_notif { display:block !important; }'+
'.bfb_hidden,.bfb_hidden.bfb_new_comments { display:none !important; }'+
'.bfb_minimized img, .bfb_minimized .comments_add_box { display:none !important; }'+
'.bfb_minimized > *, .bfb_minimized { min-height:0px !important; padding-bottom:0px; padding-left:0px !important; }'+
'.bfb_minimized * { margin:0 !important; }'+
'.bfb_minimized .uiStreamMessage, .bfb_minimized .GenericStory_Message { padding-left:0px !important; }'+
'.bfb_minimized .UIStoryAttachment { margin:0px !important; }'+
'.bfb_read.bfb_duplicate, .bfb_duplicate { display:none !important; }'+
''+
'html.alternate_read_display .bfb_read, html.alternate_read_display  .bfb_muted { display:block !important; max-height:18px; min-height:18px !important; overflow:hidden; opacity:.25; }'+
'html.alternate_read_display .bfb_read:hover, html.alternate_read_display  .bfb_muted:hover { max-height:none;overflow:visible;opacity:1; }'+
'html.alternate_read_display .bfb_read.bfb_new_comments, html.alternate_read_display  .bfb_read.bfb_new_comments .bfb_new_comment_notif { max-height:none;overflow:visible;opacity:1; }'+
''+
'/* Make sure that show all actually shows all */'+
'#content .bfb_show_all .bfb_processed { display:block !important; }'+
'#content .bfb_show_all .bfb_duplicate { display:none !important; }'+
''+
'.UIButton_better_fb { margin:0px 3px !important; padding:0px 4px !important; }'+
''+
'.bfb_new_comment_notif { width:350px; background-color:#edeff4 !important; -moz-border-radius: 5px; -webkit-border-radius: 5px; font-size:11px; line-height:16px; padding:1px 0px 1px 5px !important; color:black; font-weight:bold; border:1px solid #aaa !important; border-right-color:#666 !important; border-bottom-color:#666 !important; border-right-width:2px !important; border-bottom-width:2px !important; }'+
''+
'/* Post Actions */'+
'.bfb_post_action_container { opacity:.5; display:block; position:absolute; z-index:14; top:0px; right:15px; padding:0; background-color:white; }'+
'.bfb_post_action_container:hover { opacity:1;  }'+
'.uiUnifiedStory:hover .bfb_post_action_container { display:block; }'+
'.bfb_post_action { background:transparent url("data:image/gif,GIF89aZ%00%1E%00%B3%00%00%D1%00%00%98%AD%CB%E4%E6%E9%D7%D9%DC%A5%B5%D0%D7%D9%DD%C0%C5%D0%D6%D8%DC%D8%DA%DE%C6%CB%D2%D8%D9%DD%AD%BD%D6e%84%B2%FF%FF%FF%00%00%00%00%00%00!%F9%04%00%00%00%00%00%2C%00%00%00%00Z%00%1E%00%03%04%FF%B0%C9I%AB%BD8%EB%CD%BB%FF%D7%22%8E%D4h%9A%D6p%16%60%EB%96%A7(-%1B%3D%8DB%23%90X%EC%C9%1C%A0%25%06%A4%F1%1A%24%1B%12%A7C%0Dm%C2Z%B4%17%3D%CD%9CP%19%CF%A6%22%8E%0C%CFk%E7%98!%FB%96%DB%9B%13y%C5%09vk%B5X%AA%2CO%CFV%B6%BA%9Ee%C2%C9%7Bu%25%7B%3D%13%0C%0C6%87mT3%81J%7D%229%7FSr%8C%800H%87%0C%0D%9A%8B!P%8Bih%91Mq%81T%970%23%9A%8Am%5BXh%84%90%0B%92%26%04aK%A8A%40%9D%8E%B3%8D%1A6%0A%26%B5%23%09%15Ue%3F%12%AC%9B%AEEkGy%AEo%93%B8%B9%2F%16%9D%BDx%A6EvD%A8%94%D9%9C%CE%E5%CF%5Ea%82%15%07\'%08%E4%F0%F1%AA%F2%1C%01%CD%F7%87%01%F6%F8%CD%FA%FC%FD%FB%FE%E5%0B(%D0%9F%C0%7C%07%13*4g%A8W%06%7C\'%16J%9Cx%10%83%A2%8A%ACV%1D%D2%88O%9BBf%09%C8A%DE%B3%B8%C9%9C%C3%92%1B9%9A%E8x%AE%5CH%91%FF%1A%B6%AA%D4%B0%25%A7%9A%9A%BCpd%05%12fL%9F%2C%5D2%9C%83s%A6%C8r%11S%EEl%C5%B4%22%D0%91%3E%AF%F5%E4%09%13%E9J%A5%22%82%0A%E5y%B2%A3%26%00%00%CA%81%9D%99%EE%9C%C3%A3X%17%E4%BC%0A%F5%A7I~%CC%1A%80%05%C0%60.%D9pfM%16M%8A%88-%D5%A7C%05V%98%3B%D6(%D1%A92%0DYU9%82%40%5Bgp%01%FF%3Dd%F7%EC%E1%BC1%D7f%C5%FA%F8%22%DC%85b%09%5B%C6%96%F8(%85%8C%8C7S%EDE%F1%9F%DD%CAR%B7N%E5%A73%B2%CC%D6%F7%0A%D7%A5%3B%94%E4%EA%AD%F7%F8R%24%F8%CF%E0A%E3%05%89%DFf%80%BC8q~%01%22%00%00%3B") no-repeat 0 0; }'+
'.bfb_post_action { text-align:center; float:right; width:15px; display:inline; height:15px; margin:0px 2px; cursor:pointer; }'+
'.bfb_post_action_read { background-position:0 0; }'+
'.bfb_post_action_read:hover { background-position:0 -15px; }'+
'.bfb_post_action_unread { display:none; background-position:-15px 0; }'+
'.bfb_read .bfb_post_action_unread { display:block; }'+
'.bfb_post_action_unread:hover { background-position:-15px -15px; }'+
'.bfb_post_action_mute { background-position:-45px 0; }'+
'.bfb_post_action_mute:hover { background-position:-45px -15px; }'+
'.bfb_post_action_add { background-position:-30px 0; }'+
'.bfb_post_action_add:hover { background-position:-30px -15px; }'+
'.bfb_post_action_info { background-position:-60px 0; }'+
'.bfb_post_action_info:hover { background-position:-60px -15px; }'+
'.bfb_post_action_google { background-position:-75px 0; }'+
'.bfb_post_action_google:hover { background-position:-75px -15px; }'+
''+
'/* Help Popup */'+
'#bfb_button_help input { padding-left:20px; background:transparent url("data:image/gif,GIF89a%10%00%10%00%F7%00%00%00%FF%00%10J%B5%10R%B5%10R%C6%10R%D6%10Z%D6!R%C6!Z%B5!Z%C6!Z%E7!c%F7!k%F7!k%FF1Z%8C1k%FF1s%FF9Z%8CBs%A5Bs%FFB%7B%F7B%7B%FFJk%94J%84%D6Rk%94Rs%9CR%7B%C6R%84%D6R%84%E7R%84%F7R%84%FFR%8C%D6R%8C%F7R%8C%FFZ%84%9CZ%8C%D6c%8C%C6c%8C%D6c%94%C6c%94%F7c%94%FFk%84%ADk%9C%D6s%8C%9Cs%94%ADs%94%B5s%94%F7s%9C%C6s%9C%D6s%9C%F7s%9C%FFs%A5%E7%7B%94%94%7B%9C%AD%7B%A5%D6%84%A5%D6%84%AD%D6%84%AD%E7%84%AD%FF%8C%B5%E7%94%9C%9C%94%9C%A5%94%AD%BD%94%AD%C6%94%AD%E7%94%AD%F7%94%B5%FF%A5%BD%CE%A5%BD%D6%A5%BD%DE%A5%BD%E7%A5%BD%F7%A5%BD%FF%A5%C6%FF%AD%C6%DE%B5%C6%D6%B5%C6%F7%B5%CE%E7%B5%CE%F7%B5%CE%FF%BD%BD%BD%BD%C6%C6%BD%C6%CE%C6%CE%D6%C6%CE%E7%C6%D6%DE%C6%D6%F7%C6%D6%FF%C6%DE%F7%CE%DE%E7%DE%DE%E7%E7%EF%F7%E7%F7%F7%E7%F7%FF%F7%F7%F7%F7%F7%FF%F7%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF!%F9%04%01%00%00%00%00%2C%00%00%00%00%10%00%10%00%00%08%BD%00%01%08%1CH%B0%A0A%00%3Aj%A4%B0qp%60%8D*%5B%C0%80%F1%C2%C4%C5A%22%5B%AC%E4%E8%D0!G%15-7%0A%D6%D8rDB%10%2F%60%B8%9C0%A2e%04%C1*N(%C4%00%83%E4%04%12%2F%13%8A%24%19%F8bK%0E%09%1D%828X%D0%02%CC%06%12%5BB%08%14%01%A6%83%83%A7%0ALl%A9b%E0%00%18%08%02-%80%91%E0%40A%82%0F%60%8A%20%08%60%15%2B%00%0F%5E%60%24X%8B%03%0C%81%00%022h%B90%B0%0A%93%04%03%08h%C0%11%A0%EF%10%25%04%5Dh%E1%3B%E0%07%98%BE%82Q%14%C4%A1%A5H%06%04%07%2C%10%C9%C2%E2%E0%88%24Z%24j%91%B2%A2%A1%C0%08%10.%60%F0Lz%60%40%00%00%3B") no-repeat left center; }'+
'.bfb_help_wrapper { z-index:9999; width:700px; height:600px; position:fixed; top:25px; left:25px; border:5px solid #D8DFEA; -moz-border-radius:15px; -webkit-border-radius:15px; background-color:#F7F7F7; padding:15px 0; -moz-box-shadow:5px 5px 5px #999; -webkit-box-shadow:5px 5px 5px #999; }'+
'.bfb_help_wrapper iframe { width:680px; height:550px; border:none; }'+
'#bfb_help_close { float:right; margin:25px 50px 0 0;  }'+
'.bfb_page_post_message { font-size:12px; border:2px solid #3B5998; -moz-border-radius:5px; -webkit-border-radius:5px; padding:5px; margin:5px; }'+
'#bfb_page_post_message_help { padding-left:20px; background:transparent url("data:image/gif,GIF89a%10%00%10%00%F7%00%00%00%FF%00%10J%B5%10R%B5%10R%C6%10R%D6%10Z%D6!R%C6!Z%B5!Z%C6!Z%E7!c%F7!k%F7!k%FF1Z%8C1k%FF1s%FF9Z%8CBs%A5Bs%FFB%7B%F7B%7B%FFJk%94J%84%D6Rk%94Rs%9CR%7B%C6R%84%D6R%84%E7R%84%F7R%84%FFR%8C%D6R%8C%F7R%8C%FFZ%84%9CZ%8C%D6c%8C%C6c%8C%D6c%94%C6c%94%F7c%94%FFk%84%ADk%9C%D6s%8C%9Cs%94%ADs%94%B5s%94%F7s%9C%C6s%9C%D6s%9C%F7s%9C%FFs%A5%E7%7B%94%94%7B%9C%AD%7B%A5%D6%84%A5%D6%84%AD%D6%84%AD%E7%84%AD%FF%8C%B5%E7%94%9C%9C%94%9C%A5%94%AD%BD%94%AD%C6%94%AD%E7%94%AD%F7%94%B5%FF%A5%BD%CE%A5%BD%D6%A5%BD%DE%A5%BD%E7%A5%BD%F7%A5%BD%FF%A5%C6%FF%AD%C6%DE%B5%C6%D6%B5%C6%F7%B5%CE%E7%B5%CE%F7%B5%CE%FF%BD%BD%BD%BD%C6%C6%BD%C6%CE%C6%CE%D6%C6%CE%E7%C6%D6%DE%C6%D6%F7%C6%D6%FF%C6%DE%F7%CE%DE%E7%DE%DE%E7%E7%EF%F7%E7%F7%F7%E7%F7%FF%F7%F7%F7%F7%F7%FF%F7%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF!%F9%04%01%00%00%00%00%2C%00%00%00%00%10%00%10%00%00%08%BD%00%01%08%1CH%B0%A0A%00%3Aj%A4%B0qp%60%8D*%5B%C0%80%F1%C2%C4%C5A%22%5B%AC%E4%E8%D0!G%15-7%0A%D6%D8rDB%10%2F%60%B8%9C0%A2e%04%C1*N(%C4%00%83%E4%04%12%2F%13%8A%24%19%F8bK%0E%09%1D%828X%D0%02%CC%06%12%5BB%08%14%01%A6%83%83%A7%0ALl%A9b%E0%00%18%08%02-%80%91%E0%40A%82%0F%60%8A%20%08%60%15%2B%00%0F%5E%60%24X%8B%03%0C%81%00%022h%B90%B0%0A%93%04%03%08h%C0%11%A0%EF%10%25%04%5Dh%E1%3B%E0%07%98%BE%82Q%14%C4%A1%A5H%06%04%07%2C%10%C9%C2%E2%E0%88%24Z%24j%91%B2%A2%A1%C0%08%10.%60%F0Lz%60%40%00%00%3B") no-repeat left center; font-weight:bold; text-decoration:underline; cursor:pointer; }'+
''+
'/* Position of Facebook\'s "close" X */'+
'.bfb_processed .hideSelector, .bfb_processed .hideButton { margin-top:-10px; }'+
'.profile .bfb_processed .hideSelector, .bfb_processed .hideButton { margin-top:-6px; }'+
'.UIRecentActivityStory .hideSelector, .UIRecentActivityStory .hideButton ,'+
'.uiStreamMinistory .hideSelector, .uiStreamMinistory .hideButton, '+
'.UIRecentActivityStory .hideSelector, .UIRecentActivityStory .hideButton'+
'	{ margin-top:-1px; }'+
''+
'/* Data-loading iframe */'+
'.bfb_iframe { position:absolute; height:200px; width:200px; z-index:-5000; visibility:hidden; }'+
''+
'/* Options Display */'+
'.GM_options_wrapper { display:none; position:absolute; top:50px; left:50%; background-color:white; z-index:5000;}'+
'.GM_options_wrapper_inner { margin-left:-400px; width:800px; background-color:white; border:8px solid #3B5998; -moz-border-radius: 15px; -webkit-border-radius: 15px; padding:10px; z-index:5001; font-size:110%; -moz-box-shadow:10px 10px 10px #999; -webkit-box-shadow:10px 10px 10px #999; }'+
'.GM_options_wrapper h2 { font-size:14px; background-color:#3B5998; color:white; font-weight:bold; font-style:italic; padding:1px 10px; margin:0px; }'+
'.GM_options_header { background-color:white; color:#3B5998; min-height:90px; border-bottom:5px solid #3B5998; }'+
'.GM_options_header a { color:#3B5998; }'+
'.GM_options_message { clear:both; background-color:yellow; padding:10px; border:1px solid black; -moz-border-radius: 10px; -webkit-border-radius: 10px; margin:10px; font-weight:bold; font-size:larger; }'+
'.GM_options_wrapper table.GM_options { border:1px solid #999; border-collapse:collapse; width:100%; }'+
'.GM_options_wrapper td.label, .GM_options_wrapper td.input, .GM_options_wrapper td.html  { border:1px solid #999; margin:0px; padding:0px; }'+
'.GM_options_wrapper td.label { padding:0px 5px; }'+
'.GM_options_buttons { float:right; width:200px; height:50px; vertical-align:middle; text-align:center; }'+
'.GM_options_buttons input { background-color:#3B5998; color:white; font-size:24px; font-weight:bold; }'+
'#bf_options_body { clear:both; border:1px solid #3B5998;padding:5px;max-height:500px;min-height:500px;overflow:auto;background-color:#f3f3f3;}'+
'.bf_option_body {display:none;}'+
'.bf_option_body > div { padding:2px; font-size:14px; border-top:1px solid #ddd; }'+
'.bf_option_body > div:nth-child(even) { background-color:#ececec; }'+
'.bf_option_body > div > div { margin-left:30px; }'+
'.bf_option_body input[type=checkbox] { width:12px; height:12px; } '+
'#bf_tracelog, #bfb_user_prefs { font-family:courier new; font-size:12px; height:300px;overflow:auto;border:1px solid #ccc;background-color:white; }'+
'#bfb_user_prefs { width:600px; white-space:pre; }'+
'select.bfb_disabled { background-color:#eee; color:#ccc; }'+
''+
'/* Tabs */'+
'.bf_tabs { padding-left:4px; }'+
'.bf_tabs > * {line-height:24px;float:left;font-family:arial;background-color:#3B5998;color:#ddd;border:1px solid #EDEFF4;border-bottom-color:#3B5998;-moz-border-radius-topleft:8px;-moz-border-radius-topright:8px;-webkit-border-top-left-radius:8px;-webkit-border-top-right-radius:8px;padding:0px 14px 0px 10px;margin-left:-4px;z-index:1;cursor:pointer;}'+
'.bf_tabs > .bf_tab_selected + * {margin-left:0px;}'+
'.bf_tabs > .bf_tab_selected {position:relative;top:1px;background-color:#f3f3f3;color:#3B5998;border-color:#3B5998;border-bottom:none;border-top:2px solid #3B5998;z-index:2;padding-right:5px;font-weight:bold;}'+
''+
'/* Feed Tabs */'+
'#bf_feed_tabs .bf_tab { font-size:110%; }'+
'#bf_feed_tabs .bf_tab_selected { background-color:white; }'+
'.bf_stream { border-top:1px solid #ccc; clear:both; display:none; }'+
'.bf_tab_body_selected { display:block; }'+
'.bf_tab_count { margin-left:8px; }'+
'.bf_tab_count .new { margin-right:1px; font-weight:bold; }'+
'.bf_tab_count .total { margin-left:1px; }'+
'.bfb_tab_empty { background-color:#ddd; color:#aaa; font-style:italic; border:1px solid #aaa; }'+
''+
'/* Dialog */'+
'.bfb_dialog { position:fixed; background-color:#FFFDEA; width:600px; top:50px; left:10px; z-index:9999; padding:5px; '+
'				font-family:arial; font-size:14px; -moz-box-shadow:12px 12px 15px #666; -webkit-box-shadow:5px 5px 5px #999;'+
'				border:4px solid #F4D307; -moz-border-radius:8px; -webkit-border-radius: 8px; }'+
'.bfb_dialog_header { font-size:16px; font-weight:bold; }'+
'.bfb_dialog_content { margin:5px 10px 0px 10px; }'+
'.bfb_dialog_footer { margin:5px 0px; text-align:center; }'+
''+
'/* Messages, Tips */'+
'.better_fb_mini_message { background-image:url("data:image/gif,GIF89a%0B%00%0D%00%F7%00%00%9C%9A%9C%FC%FE%FC%00%00%12%00%00%00%60%94%00%23%E9%D0%00%12%FD%00%00%7F)%00%80!%D0%EA%00%FD%12%00%7F%00%00J%04%00%F8%26%15A%83%00~%7C%12%00J%00%00%F8%00%00A%00%00~%00%00%00%02%00%00%00%00%00%00%00%00%00%94%00%03%E9%00%00%12%00%00%00%00%D8%FC%98%E8%05%EA%12%07%12%00%00%00%F9%F6%11%E5%05%01%81%07%00%7C%00%00%00%98%90%00%E9%EA%01%12%7D%00%00%00VJ%AC%00%F8%EA%00A%12%00~%00%E0%00%BE%E7%00c%12%00E%00%00~n%00%00%00%00%00%00%00%0C%00%00%00%00%B0%00%E9%E9%00%12%12%00%00%00%00%20%00%98%E9%00%EA%90%00%12%7C%00%00%60%00%FC%00%D0%84%91%FDA%7C%7F~%FF%C4%A4%FF%E9%85%FF%12A%FF%00~%5D%BE%0E%00c%06%91E%09%7C~%00%95%00%01%E7%00%00%81%0C%00%7C%00%00%00%00%87%00%00%F7%15%00A%00%00~%60%B0%3B%03%E9%04%00%12%D4%00%00%00%10%1AX%BE%7C%D6%1A%80A%00%18~8%00%E4_%00%EA%15%00%12%00%00%00%00%FC%87%00%05%C4%00%07A%00%00~~%00%93%00%00%C4%00%00A%C0%03~%00%11%87%00%01%F7%00%00A%00%00~%FF%F6%3B%FF%05%04%FF%07%D4%FF%00%00%FF%ECX%FF%E9%D6%FF%12A%FF%00~%00%0C%01%00%B5%00%00A%00%00~%00%00%90%BC%00%EA%EA%00%7D%12%00%00%00%00%11%00%00%01%00%15%00%00%00%00%00%A8%00p%FD%00%9E%00%00%80%00%03%7C%10%1C%00%E9%B5%00%12A%00%00~%00%AF%00%00%EB%00%00%81%00%00%7C%00%00Z%00%07%E3%00%00%81%00%00%7C%00%00%40%00%00%B9%00%00P%00%00%00%00%008%00%00_%00%40%01%00%15%00%00%00lD%00%00%EA%00%00%12%00%00%00%00L%A8%00%E8%FD%00%12%00%00%00%00%004(%00%00%EA%00%00%12%00%C0%00%00%AC%CD%00%FB%2B%00%12%83%00%00%7C%00%20%00x%E9%00%9E%90%00%80%7C%00%7C%60%00%FF%00%00%FF%91%00%FF%7C%00%FF%FF%00p%FF%00%9E%FF%00%80%FF%00%7C%5D%00%3D%00%01%00%91%00%00%7C%00%00Z1%3D%F4%2C%00%80%83%00%7C%7C%00%00L%FC%00%EA%F0%15%12%12%00%00%00%00%0C%FF%00%2C%FF%00%83%FF%00%7C%FF8%00%00_%00%00%15%00%00%00%00%00%00%18T%01%00%EB%00%00%12%00%00%00%00%7CF%00d%83%00%83L%00%7C%00g%004%F4%00%EB%80%00%12%7C%00%008Pw%EA%EBP%12%12O%00%00%008%B5h_d%EB%15%83%12%00%7C%00%00%D4%7C%00ld%0CO%83%00%00%7C%00%E0%25%00w%ED%00O%12%00%00%00%B0%00%C1%E9%01%FF%12%00%FF%00%00%7F%7CL%E8%E9%EA%EC%12%12%12%00%00%00%86%00%00%7D%01%00%80%00%00%18%00%00%CB%D0%7C%00dd%05%83%83%00%7C%7C%00%01%00%00%00%00%00%00%00%00%00%00%00%00%A8%00%00%FD%00%00%00%00%00%00%B0%00p%E9%00H%12%00%15%00%00%00%00%00%01%D0%00-%FD%00H%7F%00%00!%F9%04%00%00%00%00%00%2C%00%00%00%00%0B%00%0D%00%07%08)%00%03%08%1CH%B0%A0%C1%83%07%01%00%18%A8%90%A0%C2%85%0F%0B%3Elh0b%C5%89%12%1BZ%14H1%40G%84%20C%16%0C%08%00%3B"); background-repeat:no-repeat; background-position:center right; cursor:pointer; padding:1px 10px 1px 1px; background-color:#FFFDEA; font-family:arial; font-size:10px;font-weight:bold; margin:1px; border:2px solid #F4D307; -moz-border-radius:3px; -webkit-border-radius: 3px; }'+
'.better_fb_mini_message:hover { background-image:url("data:image/gif,GIF89a%0B%00%0D%00%F7%00%00%3CZ%9C%FC%FE%FC%00%00%12%00%00%00%60%94%00%23%E9%D0%00%12%FD%00%00%7F!%00%80!%D0%EA%00%FD%12%00%7F%00%00J%04%00%F8%26%15A%83%00~%7C%12%00J%00%00%F8%00%00A%00%00~%00%00%00%02%00%00%00%00%00%00%00%00%00%94%00%03%E9%00%00%12%00%00%00%00%D8%DE%98%E8%06%EA%12%0F%12%00%00%00%F9%A2%11%E5%07%01%81%18%00%7C%00%00%00%98%B8%00%E9%DF%01%12%81%00%00%00VJ%AC%00%F8%EA%00A%12%00~%00%E0%00%BE%E7%00c%12%00E%00%00~n%00%00%00%00%00%00%00%0C%00%00%00%00%B0%00%E9%E9%00%12%12%00%00%00%00%20%00%98%E9%00%EA%90%00%12%7C%00%00%60%00%FC%00%D0%84%91%FDA%7C%7F~%FF%C4%A4%FF%E9%85%FF%12A%FF%00~%5D%BE%AE%00c%07%91E%0E%7C~%00%95%00%01%E7%00%00%81%0C%00%7C%00%00%00%00%87%00%00%F7%15%00A%00%00~%60%B0%0F%03%E9%08%00%12%24%00%00%00%40%1AX2%7C%D6!%80A%00%18~8%00%E4_%00%EA%15%00%12%00%00%00%00%DE%87%00%06%C4%00%0FA%00%00~~%00%93%00%00%C4%00%00A%C0%03~%00%11%87%00%01%F7%00%00A%00%00~%FF%A2%0F%FF%07%08%FF%18%24%FF%00%00%FF%ECX%FF%E9%D6%FF%12A%FF%00~%00%0C%01%00%B5%00%00A%00%00~%00%00%B8%BC%00%DF%EA%00%81%12%00%00%00%00%11%00%00%01%00%15%00%00%00%00%00%24%00p%7D%00%9E%00%00%80%00%03%7C%10%1C%00%E9%B5%00%12A%00%00~%00%AF%00%00%EB%00%00%81%00%00%7C%00%00Z%00%07%E3%00%00%81%00%00%7C%00%00%40%00%00%B9%00%00P%00%00%00%00%008%00%00_%00%40%01%00%15%00%00%00lD%00%00%EA%00%00%12%00%00%00%00L%24%00%E8%7D%00%12%00%00%00%00%004(%00%00%EA%00%00%12%00%C0%00%00%AC%CD%00%FB%2B%00%12%83%00%00%7C%00%20%00x%E9%00%9E%90%00%80%7C%00%7C%60%00%FF%00%00%FF%91%00%FF%7C%00%FF%FF%00p%FF%00%9E%FF%00%80%FF%00%7C%5D%00%3B%00%01%00%91%00%00%7C%00%00Z1%3B%F4%2C%00%80%83%00%7C%7C%00%00L%FC%00%EA%F0%15%12%12%00%00%00%00%0C%FF%00%2C%FF%00%83%FF%00%7C%FF8%00%00_%00%00%15%00%00%00%00%00%00%18T%01%00%EB%00%00%12%00%00%00%00%7CF%00d%83%00%83L%00%7C%00g%004%F4%00%EB%80%00%12%7C%00%008Pw%EA%EBP%12%12O%00%00%008%B5h_d%EB%15%83%12%00%7C%00%00%D4%7C%00ld%0CO%83%00%00%7C%00%E0%23%00w%ED%00O%12%00%00%00%B0%00%C3%E9%01%FF%12%00%FF%00%00%7F%7CL%E8%E9%EA%EC%12%12%12%00%00%00%86%00%00%7D%01%00%80%00%00%18%00%00%D9%D0%7C%00dd%06%83%83%00%7C%7C%00%01%00%00%00%00%00%00%00%00%00%00%00%00%24%00%00%7D%00%00%00%00%00%00%B0%00p%E9%00H%12%00%15%00%00%00%00%00%01%D0%00-%FD%00H%7F%00%00!%F9%04%00%00%00%00%00%2C%00%00%00%00%0B%00%0D%00%07%08)%00%01%08%1CH%B0%A0%C1%83%07%03%04%18%A8%90%A0%C2%85%0F%0B%3Elh0b%C5%89%12%1BZ%14H%11%40G%84%20C%16%0C%08%00%3B"); }'+
'.better_fb_message { clear:both; background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%23%00%00%00%23%08%02%00%00%00%91%BB%24%0E%00%00%00%06tRNS%00%00%00%00%00%00n%A6%07%91%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%06.IDATx%DA%E5%97%5Dl%DB%D6%15%C7%FF%A4%24J%B2d%C9%96%AA%C5%8A%12%3B%8E%5D%E7s%C1%92eu%8B%A4S%8B%C6Y%DD%06%CD%87%8B%3C%04%5B%83%3E5%D8V%EC%E3%A1%F0C%91%01%1D0l%E8%B0%97%14%E9%8A%AC%40%1E%16%17k%96%B5%CD%86%B9M%D6%C0%CE%9C%CD%AE%5D\'UmGql%CB%B2%ADY%1F%96%25J%A4H%5E%92%F7%EEAN%90%D5%5Em%A7%C1%5E%F6%7F%22.%0F%CF%8F%FF%83s%EF!%81%FF%95%B8%95%87%8E%0Fv%C5%23%03%F3%B3%09R%92%84%0A%B7%CB%5B%B9%A6~%7B%C3%EE%C7%BD%81%E0%83!%A9R%F1%FAG%E7%BA%3B%CE%24%A2%11%00N%B7%DDQa\'%84W%8A%25j%12O%20%B4%F3%3B%87%F7%1E%FBAM%5D%E3W%22M%0D%F5w%FC%ECD%22%1A%F1%04B%E1%A3%5B%EAv%B4%F8BM%8E%0A%AF%AE%5Bsi-%1D%8B%96%DF%C0%13%08%1Dx%B9%FD%B1%B6%13%F7Y%D9%A1%AE%3F%B7%EF%09%BC%D2%EC%EE%3C%7DRM%7F%C8%A8%C8%BE%20*S%7D%F8%9F%17~%FB%FAa%DF%8Fv%B8%3AO%9F%BC%1F%CCd%A4%B7%7DO%E0%E4%93%FE%5B%3D%BF%A1%FA03%A6%18%15%19%95%17%C1DF%C5%5C%E2%FC%A9%176%BC%BC%CDv%E5%EC%AFW%87Q%A5%E2%2F%DB%BE%F9J%B3%FBVw%3BcW%A8%DA%C7%CC4%A32c%84-!%C2%A8H%E6%DEx%FD%B0%AF%7DO%602%D2%BBdN~%C9%D5%7F%FC%F1%ADD4%B2%EF%F8%E3%0F7%D71%0D%9C%B5%DC%5D%06%00%40%FFb4%D3%01%D8%7C%DF%7B%FE%C7%B5J%B1%F4%D73%BFX)I%16%E7%BB%3B%DE%AEm%AA%7Cl_%08%E6%3A%C0%C5%18%01S%EF%26%BD%03%BB%07%C94%00u%CD%2F%3D%F247%DA%D35%3E%D8%B5%22R%EC%FA51%93%D8%FC%A8%C7%B5%A6%1A%00%A0%01%1Ac%04L%03%8CE%B0%3B%3C*r%F6M%FB%9F%A9d%A6y%FD%A3%0F%16%A7%B5.%5E%9A%1E%E9%07%B0%F9%EB%B5%8CV%82%8A%1C%00%D8a%C1%82-%0E%60%E5%0Db%BB%E3%D2(%DFb%1A%7C%5B%D6z%FDdl%E0%EA%8A%3C%E5fg%3DU%B6%AAj%C1%24%C4%D4%F2%8C%8A%80%0C%AA-%D4%B0%EC%0C%06%98%B2%E0%8F%8A%8C%11%C6%8A0e%00k%B7%98J%B1%24ff%97%F7%94%CF%A7%EET_%E4%E1%06%AA%60%CA%B0XA%C1x%CF%7Fnu%0D%00c%C4%24%BC%C5%22%19J%DC%02T%BA%8DIyN)%C9%CB%93%9C%82%BB%7CA%F23B%B5%97%D7f%60%07%07%C0%02P0%DE%0EF8N%00%E7%00g%07%E7%A4%B4%1A%98%26%85%9C%60%8FC%89%14%25%97%C5%E6rV%B8%96%AF%5E%E5Ck%D4%92%96%CF%11%00T%8DQSZ%A8%A1)%82%E5aJ%00%C0%FB%C1%07%00%2Bh%9E%91iUJ%F0%FC%18S%AFh%12W%9C%E5%2B%FD~%AB%60_%DES%A8i%93%A6%B0%B9X%3A%B8%D1o(%25%2Bb%BC%03L%93%60%07g%0Dq%B6%06%00%A0Yf%0C%C1LS%26%98%25%86%92%88%8A%24G%22b%9E%CF%A6-%B5%BBB.%AFoyR%FD%EE%7D%CE%CA%8A%81%3E%B5qW%D1%EAp%00%25%A6%25y%A1%CE%EE%080%3D%C3%1B%09F%C5%BB%C1T%CB%EBr%80%EA%19*%9D%85%80%DB%83%D5J%B1%B8%F3%89gp%EA%E2%F2%D5%AB%A9k%DC%F4h%CB%F8%E7%F3c%833%86%AA%EA%8An%C8I%AD%A0%15%26%FE%AE%CD%7DbH%7D0%26%60L%98%A5%A8)%F7%E9R%8E%EA%19*%7F%C8HZ%93%B8%1B%7D%8E%AA%9A%DA%AD%DF%3E%B8%A2%FD%04%E0%A9%17%7Fr%B3%E7b%CF%DF%D2%EBjy%C1%E9%B4%BA(%EF%00%91*L%E5!%00%8Ejb%B3%2B%0B%9E%88%22O%8D%D8%5D%098%F0%AF%09%F7%F4%AD%B9-%7B%9F%5Br6.%7D%EE%D5n%FF%D6%93%C7%7F%3A3%AE%BD%7F%BED%14E%2F%E8%24%3Bk%B5%DE%06%1D%D5%8B%B9%E2%94%AC%CC%8B%864D%B2%97%D5%EC%A4%C5n%02%D0%95*1c\'%84%AFih%5C%C5%09%0B%A0%F5%FB%AF5%1F%3C6%FAi%E2%FD%F3%A5B%862%BD%A8%CE%17uq%9Ci%FDR%F2%B3%B9%1BS%E9%D1%92V%B0%94%83%0D%A9%A4%15%2C%B2%CC%98i%DA%2B%3C%AB%23%018%F6%F33%E1%EF%FEp%ECF%E6%F7o%A7%AEu%99rN%E0%99%0D%80%D5%A53%9BA%92%AE%DCL55%7C%00%88j1%95J%2B%AA%BE%24%9B%E5%CB%07%D5%BB%1F%F7%BEy%F6%DC%D4%CD%E1%E1%BE%C9%A1%88nR%A1%AE%C1i%B5p%16%81%A3%84S%E7%AC%BCi%DA%BC.%0BW%D4%09-%88l%F8%86l%04%B7uv%F5%AC%B4%23%EE%D5%AE%D6%A3%00%06%3B%DF%BD%F4%BB_%5D%ED%8C%025%7B%5B%AA%04%1B%84%F50U%B3%98%CC%DB%D7%04e%E2%8A%8Ed%13%F1%FC%07b%20%3C%99%5E2%8Fu%85SxW%EBQ13%7B%EE%B5%97%AEv~%2C%F8%CCmM%B6%E1Q%3D%11%CF%EF%0D%85%B4%D4lLtM%CF%ECp%EC%3E%B4%7D%EABwww2%3E%B6%F8S%C9%BA%F2%91%EF%0D%04%C5%CC%EC%9B\'%0E%5C%BB8%F5%07w%AE%BC%A8K%F2%E4%CD%60%D6%16%DC%DF%D2r%E8%E0s%C9Tjh%24z%E1%2F%97%EE%DF%D3%5DXG%C7%3Bo%BD%FA%EA%F6%AD%8Fl%DA%BC%15%40%CA%E9%0AVy%B7U%7BUU%B95z%7BC%DD%06%00%FD%03%03%AB%EB%BD%25%F5l%CB%13%A1u%EBs%85%85%A1%A0*r%3E%2F%26S%A9d*%95H%24%3C%1E%CF%7F%7Bp%D5%24o%20%D8%D8%B0113%0D%C0%E7%F7%F9%FC%BE%60%CD%D7%BC%1E%AF%208%E2%F1xo_%3F%80%A6%A6%87%1F%00%09%C0%FE%96%16%00%BD%9F%F4%CFg%E7%E7%B3%F3%B1X%2C%16%8B%01p%3A%1D%9F%5D%EF%07%D0%FAt%EB%83!%B5%1D9%14%0E%87%133%D3s%D9%AC%CF%EF%AB%09%AE%AD%AF%AF\'D%7D%EFO%17%86F%A2mG%8E%EC%DC%F9%8D%AF%F4%AFq%AF%E6%B2%D9%17%8F%BF04%12%05%10Z%B7%BE%5CL%00%E1p%F8%F4%1B%A7*%5C%AE%07F*%AB%A3%E3%9DK%97%2F%8F%8DO%00hl%D8%F8%7C%5B%DB%81%03%CF%E2%FFH%FF%06%DB%01b%5BR%10nj%00%00%00%00IEND%AEB%60%82"); min-height:40px; background-repeat:no-repeat; background-position:-4px 0px; background-color:#FFFDEA; padding:2px; font-family:arial; font-size:12px; margin:2px; border:2px solid #F4D307; -moz-border-radius:8px; -webkit-border-radius: 8px; }'+
'.better_fb_message a { text-decoration:underline; }'+
'.better_fb_bulb_spacer { float:left; width:32px; height:30px; }'+
'.better_fb_close { background-color:#3B5998; color:white; border:3px solid white; border-color:#ddd #999 #999 #ddd; text-align:center; -moz-border-radius:10px; -webkit-border-radius:10px; font-size:16px; cursor:pointer; margin:5px 10px; padding:5px 20px; }'+
'.better_fb_close:hover { background-color:white; color:#3B5998; }'+
'.bfb_close_wrap { clear:both; text-align:center; line-height:32px; }'+
'.bf_update { background:none repeat scroll 0 0 #FFF8CC; border-bottom:1px solid #FFE222; color:#000000; padding:0 0 1px; font-size:11px; margin:1px 0px 10px 5px; }'+
'.bf_h4 { margin-top:7px;}'+
''+
'/* Character counter */'+
'.bfb_char_count { width:20px;height:12px;font-size:10px;background-color:#ccc;color:#000;float:right; margin-top:-8px;margin-right:-5px; text-align:center; }'+
'.mentionsTextarea + .bfb_char_count { margin-top:-12px; position:relative; top:5px; }'+
''+
'/* Pagelet styles */'+
'.pagelet_title { float:left; margin-right:5px; }'+
''+
'.uiSideNav .item.noimg { padding-left: 0px !important; }'+
'.uiHeaderNav { margin-top:2px !important; padding-top:2px !important;}'+
'.uiHeaderNav h4 { padding-bottom:2px !important; }'+
'ul.bf_uiSideNav { border:1px solid #ccc; margin:6px 0px; padding:1px 0px; clear:both; }'+
'ul.bf_uiSideNav li { width:auto; white-space:nowrap; }'+
'.bf_network { padding: 1px 0px 1px 2px !important; left:0px !important; cursor:pointer; }'+
'.bf_network .bf_network_users a { font-weight:bold; padding-left:10px; }'+
'.bf_network .bf_network_users { background-color:#F7F7F7; }'+
'.bf_friend_activity_img { float:left; margin-right:5px; clear:both; }'+
''+
'.bf_clear { clear:both; }'+
'.bf_alt { background-color:#eee; }'+
'.bf_sidebar_header_link { margin-left:6px; }'+
''+
'/* Collapsable right pagelets */'+
'#rightCol .bfb_pagelet_closed * { margin-bottom:0; padding-bottom:0; margin-top:0; }'+
'#rightCol .bfb_pagelet_closed > * > * > * { display: none; }'+
'#rightCol .bfb_pagelet_closed > * > * > *:first-child { display: block; }'+
'#rightCol .bfb_pagelet_closed .uiHeader { border-bottom: 1px solid #CCCCCC; margin-bottom:2px; }'+
'#rightCol .bfb_pagelet_closed .uiHeader .uiHeaderActions { display:none; }'+
'#rightCol .uiHeaderTitle { cursor:pointer; }'+
'#rightCol .bfb_pagelet_closed h4, #rightCol .bfb_pagelet_closed h3 { color:#ccc; }'+
'#rightCol .bfb_pagelet_closed.jewelBox > ul, #rightCol .bfb_pagelet_closed.jewelBox > .jewelFooter { display:none; }'+
''+
'/* Notification Previews */'+
'.bfb_notif_preview { max-height:500px; max-width:500px; overflow:auto; position:absolute; z-index:9999; border:1px solid black; padding:2px; background-color:white; -moz-border-radius:5px; -webkit-border-radius:5px; -moz-box-shadow:5px 5px 5px #999; -webkit-box-shadow:5px 5px 5px #999; }'+
'.bfb_notif_preview .uiUfiAddComment { display:none; }'+
'.bfb_notif_preview_message { color:#aaa; background-color:#ffffe1; font-size:10px; padding:1px; }'+
''+
'/* Debug */'+
'div.debug{ display:none; border:1px solid #ccc; background-color:#eee;color:#999; text-align:left; padding:3px 0px 3px 20px; clear:both; background-image: url("data:image/gif,GIF89a%10%00%10%00%E6%7F%00%B7%8A%2BrV%1A666%9B%9B%9B%B1%86)%F5%BCB%D6%A33%CE%9D1qqq7)%0C%FF%C6%3F)%1E%09%FD%C0%3C%F5%BA%3A%DC%B2V%03%03%02%1C%1C%1C%1C%15%07%09%09%09III%0E%0E%0D%11%11%11%12%0E%032%26%0B%FF%C2%3C%FC%BF%3C%FF%C3%3D%FF%C4%3D%F9%BD%3A%FF%C2%3D%FB%BE%3B%FC%BF%3BWWW%E5%E5%E5%F1%B79%86%86%86%FA%FA%FA%95%95%95%FF%CDR%FB%BF%3C*\'%20%FF%C1%3BG%3E(%FF%C6A%E4%E4%E4%9Dw%24OOO%E2%AB4%FF%D2c%F8%C2O%CF%AAY%E9%B17%FB%BF%3B%F2%B89%17%17%17%60%60%60%B8%97O%FF%C8%40%FF%C9C%F8%BC%3AK%3D%1E%F3%C1X%84n%3F%FB%BE%3A%B7%B7%B7%C7%A1MJJJ%AB%8FRhhhbJ%16%E9%B6F%A5%A5%A5%FA%C8%5B%CC%9B%2F%93w8%E1%E1%E1%B3%8B4%B1%B1%B1%7B%5D%1C%80f-%A8%A8%A8%FA%C3E%8Dk!%2C!%0A6*%10%06%07%0A%0A%08%02%FE%C2%3C%AE%AE%AE%BC%8E%2C%D5%A6C%FF%C6%3D%FF%C3%3F%C6%96%2F%3B%3B%3B%EF%B58%DF%DF%DFggg%BE%99J%E7%AE6yb4%FF%CBA%98%98%98%C1%93-%7B%7B%7B%FF%C3961(%AA%83%2F%AE%85%2C%82k%3A5%2F%24%FA%BE%3B%FB%BE9%B5%B5%B5%FD%BF9222%DC%ABA%FE%C1%3C%CF%9E1%FF%C4BC%3A%24%22%22%22%96%96%96%17%16%11%A3%7C\'%F9%BD%3B%00%00%00%FF%FF%FF!%F9%04%01%00%00%7F%00%2C%00%00%00%00%10%00%10%00%00%07%DE%80%7F%82%83s%14%15%5E%83%89%83%23~U*%3C%0F~%8A%89~n81%05%04%09~%03%93~j%0E90%26%5B%07%9B%8A%126AiHCk%0D%18g%16%10%83D%0F%3E%2BW%0E%0F%0F%5D%1A%0CR~%08%82%14(Fr%5C2~~%00%1A\'%22%09%15%82~m%0A%1C%1D%BB%0F%07%1Do%18-%0F%7Fy%7BZ)%7D4%05T%0B_%19%7D%193%0B%02%12xQ%3F%7D%1CwbL%0C%7D%FC%0A%01%12%12%C8%E8%E0%D0%07N%0F%25ljx%E0%A7%81%00%05%09O%CA%2C%C4%40%C7O%02%11%EC%18%7C%00%B0G%C2%02%03%1F6l%D8%C1\'K%86%3A%1D%1A%18%08%F0%00%81%1F%0BE%F8%24y%81a%C3%18%3B%04%9C%5Cx%00BP%BC%97%11%A6%5CX%10%C1%8A%1FZ%8A%D0%FCq1a%C2%1F%10a%12%05%02%00%3B"); background-repeat:no-repeat; background-position:left top; }'+
'div.debug_small { display:none; border:1px solid #ccc; clear:both; background-color:#eee !important; }'+
'div.debug_small, div.debug_small * { color:#ccc !important; text-align:left; padding:0px; }'+
'.debug_window { position:absolute; top:45px; left:1px; border:1px solid black; width:350px; max-height:800px; overflow:auto; padding:3px; }'+
'body.debug .debug, body.debug .debug_small, .post_debug .debug { display:block !important; }'+
'body.debug .bfb_duplicate { display:block; background-color:yellow; }'+
''+
'#better_fb_debug_console { max-height:500px; overflow:auto; max-width:450px; }'+
'#bfb_status { font-size:10px; color:#999; }'+
'#bfb_trace_window { width:310px; position:fixed; top:5px; left:5px; border:1px solid black; background-color:white; padding:5px; z-index:1000; max-width:310px; }'+
'#bfb_trace_window tr:nth-child(even) { background-color:#eeeeee; }'+
'#bfb_trace_window_body { max-height:300px; white-space:nowrap; overflow:auto; }'+
'#bfb_trace_window_call_stack { border:1px solid #ccc; max-height:500px; white-space:nowrap; overflow:auto; font-family:courier new; }'+
''+
'/* Install button */'+
'#install_button { float:right; background:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%01%08%00%00%01%05%08%03%00%00%00(%B6%89%13%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%C0PLTE%CF%EF%A5%AD%DAc%F5%FB%FE%7F%C3*%B2%E0x%86%C66%C8%EB%9A%F1%F9%FD%A0%D5S%AC%E2Y%C2%E8%91%8F%CB0%FD%FE%FF%96%CEF%EE%F9%FD%F9%FD%FF%E0%F6%C1%D5%F4%B0%DD%F5%BB%D8%DC%DF%E8%F8%D1%B0%DDm%B7%E2%84%2CB%20%A5%D8%5B%9C%D2%5C%96%CFS%AB%DBr%8E%CAC%F4%F4%F4%D5%F0%AF%A4%D7h%B8%C4%AA%BD%E5%8A%DA%F2%B6%ED%ED%ED%E7%F3%D9%F5%F8%F4%A0%A9%96%C8%DC%B0%ED%F8%FDe%7B%86%DC%EF%C6%C8%CB%CB%F8%F8%F8%F0%FA%E6%F9%FE%F3%BA%E3%7F%8E%B7W%FC%FC%FC%FD%FD%FC%E5%E8%E9%A9%C2%CC%F9%FC%F2%D2%40%1E%B7%E7n%B1%CE%88%E4%F7%CA%EB%CF%BB%9D%C0i%EA%F2%F5%81%B0E%E4%E4%E4%FF%FF%FFp%DA1%B2%00%00%00%01bKGD%00%88%05%1DH%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%07tIME%07%D9%04%04%1181%D8%A2%A3V%00%00%05%D5IDATx%DA%ED%91%EDj%E3%3A%10%86%C7%10L%E8R(%E1h%D9_%82%E8%06%FC%BB%F7%7Fc\'%965%D2H%B2%1D%A7%C9na%F7y%95%DA%D2%7C%BC%1A%3F%95%0B%8A%12%10%24%10%E1%A6KZ%FA%AA%B7f5%D96%9FSk%05%C6T%C3%7D%B26%EF%9CKg%E5%12%FA%0Br%BE%F5j%AE%CE%B1%08bC%97%F0%0FI%82o%22%FE%ABV%FE%C1~%7F%A4%DC%7Fq%2C%FFh%F8%06%A2%D1-%1A%9FU%C8%A6%DA%B2%A0%E1%DC%17%9A%AE*%AC%B1%D0%DD%5B%E2%DDP%F3%259%1C%F4%CA%10V%3A%C2%FA%D7%84v%AC%E4%A9g%F1%CF%E8%B9%EEWJ%5Ee%20qw%7B%CE%9Aw11%3F%F3I%C44%89m%AD*%B4Lrs2%F7%D9QRR%EA%F1%AB%DB%7C%E3%95w%C9%D3L%9DG%90%7C%81%2C%97.%8E%E2%CD%24%3A%BE%E4~%BDNj%25%97dd7%A2%B5%B6I%BD%D2g%EB%18%B6(gu\'u%A2z%B6%03ys%AB%3E%7D%1D%DA%9E%DE%DAZ%7F%D3%EEm%00%CD%1A%C7Qn%2B%FE%E6%C3%18%03c%3C%DD%96%2C%AFX%B4%FC%96t%8A%8E%A92%7Bh%26-mVw%D1%F6%14%C9%96%22%A6z%CC%C6%92%1A%D2%24y%90%D1%D8%D8%EE%25%249%A2S%A6%B3%994%7D%7B%BE%A6%D8%17%89%19e%1C%CD%17VU%99E%DD%3A%B6\'sCU-%05%FCX%FE%0F%E6%12%0Bn%5C%BF%C3%20%C93V%26b%7Dd%7D%CE%FE%2B6%EF%5B%3D%7FM%BF%D7%E5%89%99_3%D8_%20y%DB%D2%F8%F6%A0%1Enx%DCc%FCJ%F6%D8%5C%19%C4%F5%E9%8F%B8%BE%00%C4%1D%93%EBn%E2%FA%CC%5CrEQ%BB%20~~%C3%40%3F%BF%0B%C4%84%A2%00%A1%20N%A7%D3%14%7FY%93%BE%A6*0%9D%EA%B2%FAPNux-%F0%88%3A%DB%A9NM%07%1C%A6%23%A3%C8%91i%DC%5E%C6U5%CE%94%BB%B4k%DA%9D%B3%BE%D6!%EF%DD%EA%08n%7D%AA%BE%C5%ADM%EE%F6%3FE%1C%8A%02%84%82%18%A2%5C%FA%BB%3D%97%97%06%87r%AC%F7%A6%CB%99Di_%92m%CB%A6%99%BB%9Fvnm%A8%E1%E8%0D%C3n%A7%0Ch%01%F1%AB%D5%10%FF%86%F8%5E%1E%25~%7B%0Em%F5%60BC%E7%D4%05%AB%C0%D0%DD%B0%EE%D5Y%FCZ%2F%1D%EA%7D%DF2l%5E%25%BFP%14%20%14%C4%19E%01BA%BC%BF%9F%DF%DF%E3%A3%BC%CF%D5Y%F7e%7Bn%EB%B4%DA%D6%9A%0A%8DU7%95%E7%D9%B4u%96%E7%EE%D7%C4%FB%CAz%16%EB%DB%B4%9B)%DF%E5%1DE%01%02%10%80%D8%00%F1%C3%AC%EA%F0o-%F9%81%A2%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%08%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%81%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%88o%07%F1%F9%1Fk%5E%F2%89%A2%00%01%08%40l%81%F8%88K%DF%F5%DE%04V%E3%E6g%83%1FU%BE_%9B%C9~%FBi%2F%5E%B9%B9%19%AC%9Bf%C5%3D7%D8%94%7C%A0(%40(%88%0B%8AZ%03%11%9E1%0C%7F%A8%E7%E5%20%82%D1%A5y%DF%D1e%F7%A8%C1%CBC%26wK.%87%8B.%0F%5D%25%AB%05GH%F8%F0%15%5D%EEe%0F%FD%13%FC%8B%A6%BAX%10%3Ex%EFCz%CDk%D9x%B5%8D%81e%E7u%9F%96%CF\'%D3%1DB%F0uU%A9%0B%C9%25_%94%7C%B5%B0%B2N%1D%3E%DF%5Br%3A%956%87%3C%AD%B6%E4%A1%F2%5Bg%F4%EA%91~%C9%40%CA%0D%CBuY%CD%3E%CD%96%8E%A62%D8%CAP%22%C1%EC%82%19%A7%B9%A6%EE%2F%16%F5%00MM%5B%1D%B6%EA4%1D%F6%BE*J%3C%CA%20D%2C%92%DBI%D23%26%7D%CAJ%8C%89%E6%E7%12%F3NU%8BUt%94%AA%DB8%E4J%C9W%F9%25%97%B6%E2%CD%2B%5D.y%0A_%FD%E5%D9%CA%F7%E4%9F%D7i%AC%85~%A4%247%C9%D7!%84%D64%CA8%DE%9EQR%9E%A2%A7%25%2BUZR%87V%A4*)%FD%BA%1352%B9%3AQ%EA%25%DB%89u%5D%AE%93bY%0Dkk%CD%CEN6v%AD6(%5D%B7%FD%02%13%912x%9D3%C8%AAo%EF\'%E8%03%2B%5E%9B%92q%F5%DF%D3%BBK%CF%A6%9DJ%B6%AF%3E%3E%D0_.%19%DF%BAU%BF%B6%B2%1B%E9%DD%DE%03%25%87%9B%C7%83%A5%3B7%DA%CF%907%14%F5%7BA%5C_%DFr%7D%E9m%06%C4%15E%01%22%83%98z%5D%CDs%239%ED%26%AF%9B%E1%EB%A6%D7%F5%80%FD%D6%2Ce%E0%BB%FE6h%D32!%40l%818%BD%D4%F9t%3Cw%DA%AE%3B%FD%11%0A%B7%5B%E4%B4%A6%E9%B4%AF%E9%40Mk%B6_%3FM%0F%8E%F0%95%91%F7%A6%93%13%8A%12W%1D%EBSut%F6%ECZ%9F%18p%EE%E4%EA%BA%0Dc%B7%3FT%B2p%E5%E8%1E%E8ng%BD%F3%05%C9%5D%1C%8A%02%04%20%1A%10%C3%E0%E6%9F%8B%AF%F8%9C%F7%26V-%1B%2B%E16%97%3C%A3%CDF%8B%1E%3B%D7l9%D4%05z%CB%B6I%BA%CA%99%8Afj%F3nKf%10h%16%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%01%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%10%20%00%01%08%40%00%02%10%80%00%04%20%00%01%08%40%00%02%10%80%00%04%20%00%F1%DD%FA%1F5L%D8%F4.%80%00u%00%00%00%00IEND%AEB%60%82") no-repeat scroll right -130px #BAE37F; -moz-border-radius:5px;-webkit-border-radius:5px;border:1px solid #888888;color:#000044;display:block;font-size:1.5em;font-weight:bold;padding:2px 16px;text-align:center;text-decoration:none; }'+
'#install_button:hover { background-position:right 0;background-color:transparent;color:#0088FF; }'+
''+
'/* Feed Filter criteria */'+
'.bfb_filter_list td { vertical-align:top; }'+
'.bfb_filter_list td:last-child { vertical-align:middle; }'+
'#bfb_filter_list tr:first-child .bfb_up, #bfb_filter_list tr:last-child .bfb_down { display:none; }'+
'#bfb_filter_list tr:nth-child(2n) { background-color:#ddd; }'+
''+
'/* Chat */'+
'.bfb_chat_name { font-weight:bold; opacity:1; }'+
''+
'/* New window icon */'+
'.commentList a.UIImageBlock_Content { padding-left:24px; background:transparent url("data:image/gif,GIF89a%0D%00%0D%00%A2%00%00%FF%FF%FF%EF%EF%EF%EB%EB%EB%CA%CA%CA%BE%BE%BE%9A%9A%9Aeee%00%00%00!%F9%04%01%07%00%03%00%2C%00%00%00%00%0D%00%0D%00%00%0368%3AT%FE%85%ACQ%02%B87%94Y%AE%F9%06%B0-%1D%F6%89%CDc%02%A1c%89%5E%EC%60%5D%88%89%A5%F8b%C2%7C%A5%90H%EE6R%0Ci%9C%DD%A57%01B%24%8B%04%00%3B") no-repeat 6px center; }'+
''+
'/* Conditional Rules */'+
'html.hide_post_actions_until_hover .bfb_post_action_container { display:none; }'+
''+
'html.hide_hovercard .HovercardOverlay { display:none !important; }'+
''+
'html.highlight_suggest_to_friends a[ajaxify="/ajax/social_graph/invite_dialog.php?class=FanManager&node_id=174424289341"] { font-size:16px; font-weight:bold; -moz-box-shadow:0 0 30px yellow; -webkit-box-shadow:0 0 30px yellow; box-shadow:0 0 30px yellow;}'+
''+
'html.hide_connect_box #pagelet_connectbox { display:none; }'+
''+
'html.hide_suggestions_box #pagelet_pymkbox,'+
'html.hide_suggestions_box #ego,'+
'html.hide_suggestions_box #friend_guesser '+
'	{ display:none; }'+
''+
'html.hide_events_box #pagelet_eventbox { display:none; }'+
''+
'html.hide_beta_box #pagelet_betabox	 { display:none; }'+
''+
'html.hide_recommended_pages_box #pagelet_netego	 { display:none; }'+
''+
'html.hide_pokes #pagelet_pokebox,'+
'html.hide_pokes #pagelet_netego_pokes'+
'	{ display:none; }'+
''+
'html.hide_get_connected #pagelet_netego_lower	 { display:none; }'+
''+
'html.hide_questions #pagelet_questionsbox	 { display:none; }'+
''+
'html.expand_nav_messages #navigation_item_messages ul, '+
'html.expand_nav_messages #navItem_messages ul,'+
'html.expand_nav_messages #navItem_inbox ul'+
'	{ display:block !important; }'+
''+
'html.expand_nav_events #navigation_item_events ul, '+
'html.expand_nav_events #navItem_events ul '+
'	{ display:block !important; }'+
''+
'html.expand_nav_photos #navigation_item_media ul { display:block !important; }'+
''+
'html.expand_nav_friends #navigation_item_ff ul, '+
'html.expand_nav_friends #navigation_item_ff a.navMore, '+
'html.expand_nav_friends #navItem_ff ul, '+
'html.expand_nav_friends #navItem_ff a.navMore'+
'	{ display:block !important; }'+
''+
'html.expand_nav_friends_full #navigation_item_ff ul li.hiddenSubitem  { display:block !important; }'+
'html.expand_nav_friends_full #navigation_item_ff a.navMore  { display:none !important; }'+
'html.expand_nav_friends_full #navItem_ff ul li.hiddenSubitem  { display:block !important; }'+
'html.expand_nav_friends_full #navItem_ff a.navMore  { display:none !important; }'+
''+
'html.highlight_cp .better_fb_cp legend { color:red !important; font-weight:bold !important; }'+
''+
'html.left_align #globalContainer { margin:0px !important; }'+
''+
'html.static_header body.home #blueBar { position:fixed; z-index:15; }'+
'html.static_header body.home #pageHead { position:fixed; z-index:15; width:980px; }'+
'html.static_header body.home #content { padding-top:41px; }'+
'html.static_header body.profile #globalContainer { width:980px; }'+
'html.static_header body.profile #blueBar { position:fixed; z-index:15; }'+
'html.static_header body.profile #pageHead { position:fixed; z-index:15; width:980px; }'+
'html.static_header body.profile #content { padding-top:41px; }'+
''+
'html.static_left_col body.home #leftCol { position:fixed; z-index:15; padding-top:41px; }'+
'html.static_left_col #leftCol {z-index:4 !important}'+
''+
'html.hide_update_email #megaphone_story_44 { display:none !important; }'+
''+
'html.hide_options_icon #bf_options_button_icon { display:none !important; }'+
''+
'html.hide_old_comments .bfb_new_comments .better_fb_new_comment_unhighlight { display:none; }'+
''+
'html.hide_notification_pictures #jewelNotifs .uiProfilePhoto { display:none; }'+
'html.hide_notification_pictures #jewelNotifs > li { padding-top:2px; padding-bottom:2px; }'+
'html.hide_notification_pictures #jewelNotifs .info .metadata > i { display:none; }'+
''+
'html.hide_chat_panel #pagelet_chat_home_facepile, html.hide_chat_panel #pagelet_friends_online { display:none; }'+
''+
'html.show_friends_on_chat_when_offline #chatFriendsOnline.isOffline .uiFacepile, '+
'html.show_friends_on_chat_when_offline #chatFriendsOnline .uiFacepileItem '+
'	{ display:block !important; }'+
'html.show_friends_on_chat_when_offline #chatFriendsOnline.isOffline .uiHeader h4:after { content:\'Friends On Chat\'; }'+
''+
'html.pin_notifications_right_panel #jewelNotifs .blueName { color:#3B5998 !important; }'+
'html.pin_notifications_right_panel #rightCol #jewelBoxNotif {display:block !important; }'+
''+
'html.hide_status_updater #pagelet_status_updater,'+
'html.hide_status_updater #pagelet_welcome_box '+
'	{ display:none !important; } '+
'html.hide_status_updater #leftCol { padding-top:3px !important; }'+
''+
'	'+'';

	// Options that have to be written directly to the page. Bummer.
	var dialog_max_height = (window.innerHeight-200);
	var css2 = ''+
	'.bfb_cp_float { opacity:%floating_cp_opacity%; } '+
	'.bfb_post_action_container { opacity:%post_action_opacity2%; } '+
	'.uiStreamMessage {font-size:%font_size%px !important; } '+
	'.bfb_dialog .bfb_dialog_content { max-height:'+dialog_max_height+'px; overflow:auto; }'+
	'';
	var sprite_url = options.get('sprite_url');
	if (sprite_url && sprite_url.indexOf("http")==0) { 
		css2 += '.bfb_post_action { background-image:url('+sprite_url+'); }';
	}

	if (zoom!=100) {
		css2 += ''+
		'.bfb_post_action { width:'+(15*zoom)+'px; height:'+(15*zoom)+'px; -moz-background-size: '+(90*zoom)+'px '+(30*zoom)+'px; -webkit-background-size: '+(90*zoom)+'px '+(30*zoom)+'px; -o-background-size: '+(90*zoom)+'px '+(30*zoom)+'px;  } '+
		'.bfb_post_action_read:hover { background-position:0 -'+(15*zoom)+'px; } '+
		'.bfb_post_action_unread { display:none; background-position:-'+(15*zoom)+'px 0; } '+
		'.bfb_read .bfb_post_action_unread { display:block; } '+
		'.bfb_post_action_unread:hover { background-position:-'+(15*zoom)+'px -'+(15*zoom)+'px; } '+
		'.bfb_post_action_mute { background-position:-'+(45*zoom)+'px 0; } '+
		'.bfb_post_action_mute:hover { background-position:-'+(45*zoom)+'px -'+(15*zoom)+'px; } '+
		'.bfb_post_action_add { background-position:-'+(30*zoom)+'px 0; } '+
		'.bfb_post_action_add:hover { background-position:-'+(30*zoom)+'px -'+(15*zoom)+'px; } '+
		'.bfb_post_action_info { background-position:-'+(60*zoom)+'px 0; } '+
		'.bfb_post_action_info:hover { background-position:-'+(60*zoom)+'px -'+(15*zoom)+'px; } '+
		'.bfb_post_action_google { background-position:-'+(75*zoom)+'px 0; } '+
		'.bfb_post_action_google:hover { background-position:-'+(75*zoom)+'px -'+(15*zoom)+'px; } ';
	}
	css2 = _template(css2,o);
	addGlobalStyle( css + css2 );
	
	var css_url = options.get('css_url');
	if (css_url && css_url.length>0 && css_url!="null") {
		insertStylesheet(css_url);
	}

	css = options.get('css');
	if (css && css.length>0 && css!="null") {
		addGlobalStyle(css);
	}

	// Check to see if there is a CSS file defined on the page to use
/*
	onIdLoad('profile_blurb',function(blurb) { 
		blurb = blurb.innerHTML.replace(/\<.*?\>/g,'');
		var m = blurb.match(/skin\s*:\s*(http.*?\.css)/);
		if (m && m.length>0) {
			var url = "http://betterfacebook.net/skin.php?skin="+m[1];
			insertStylesheet(url,"bfb_skin");
			onIdUnload('profile_blurb',function() { var css = $('bfb_skin'); if (css){ removeChild(css); }});
		}
	});
*/
})();

// Fire a function when an ID is removed from the document
function onIdUnload(id,func) {
	var removeFunc = function(e) {
		var o = e.target;
		if (o && o.querySelector) {
			var m = o.querySelector('#'+id);
			if (m) {
				func(m,o);
				document.removeEventListener('DOMNodeRemoved',removeFunc,false);
			}
		}
	};
	document.addEventListener('DOMNodeRemoved',removeFunc,false);
}

// =================
// TAB Functionality
// =================
var previous_tab_id = null;
var home_tab="Home";
var home_tab_content_id = "home_stream";
function addTabContainer() {
	var hs = getStream();
	if (PERFORMANCE) { trace_start(arguments.callee); }
	if (hs) {
		trace("Adding tab container");
		var c = el('div','bf_tabs',{id:'bf_feed_tabs'});
		insertBefore( c, hs);
		insertBefore( el('div','bf_clear'), hs );
		attachTabContainerClickHandler(c);
		if (PERFORMANCE) { trace_end(arguments.callee); }
		return c;
	}
	if (PERFORMANCE) { trace_end(arguments.callee); }
	return null;
}
function attachTabContainerClickHandler(container) {
	bind(container,'click',function(e) {
		var new_tab = getParentByClass(e.target,'bf_tab');
		if (!new_tab) { return; }
		var tab_id = new_tab.id;
		if (tab_id==previous_tab_id) { return; } // Same tab clicked
		// Unselect previous tab
		var previous_tab = document.querySelector(".bf_tab_selected");
		if (previous_tab) { removeClass(previous_tab,"bf_tab_selected"); }
		// Select new tab
		addClass(new_tab, "bf_tab_selected");
		// Unselect previous body
		var previous_body = document.querySelector(".bf_tab_body_selected");
		if (previous_body) { removeClass(previous_body,"bf_tab_body_selected"); }
		// Select new body
		var body_id = getTabBodyId(tab_id);
		var new_body = document.querySelector("#"+body_id);
		if (new_body) { addClass(new_body,"bf_tab_body_selected"); }
	});
}
function getTabId(name) {
	return "bf_feed_tab_"+(name.replace(/[^a-zA-Z0-9_]/g,""));
}
function getTabBodyId(tab_id) {
	return (tab_id=='bf_feed_tab_Home')?home_tab_content_id:tab_id+"_body";
}
function addTab(name,o) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var tab_id = getTabId(name);
	var home_stream = getStream();
	if (home_stream) {
		var content, tab_feed_id;
		if ($(tab_id)==null) {
			trace("Adding tab: "+name);
			var container = $('bf_feed_tabs');
			// If there is no tab container, and the first tab we are adding is not Home, then first add Home!
			if (!container) {
				if (name!=home_tab) {
					addTab(home_tab,o);
					container = $('bf_feed_tabs');
				}
				else {
					container = addTabContainer();
				}
			}
			if (container) {
				var selected = (container.getElementsByTagName('div').length==0);
				var tab = el('div','bf_tab '+(selected?"bf_tab_selected":""),{id:tab_id},null,name);
				var counter_id = tab_id+"_count";
				append(tab, el('span','bf_tab_count',{id:counter_id}) );
				append(container, tab );
				if (name==home_tab) {
					addClass(home_stream,"bf_tab_body_selected");
					addClass(home_stream,"bf_stream");
					content = home_stream;
					home_tab_content_id = home_stream.id;
				}
				// Add a new feed container for this tab
				else {
					tab_feed_id = tab_id+"_body";
					content =el('ul','uiList uiStream bf_stream '+(selected?"bf_tab_body_selected":""),{id:tab_feed_id});
					insertAfter( content, home_stream );
				}
				// Watch for changes in the content, to update the tab
				attachTabCountUpdateHandler(tab_id);
			}
		}
		if (PERFORMANCE) { trace_end(arguments.callee); }
		var $tab = $(tab_id);
		if ($tab==null) {
			trace("Tab not created: "+tab_id);
		}
		return $tab;
	}
	else {
		trace("No stream found while trying to add tab ["+name+"]");
	}
	if (PERFORMANCE) { trace_end(arguments.callee); }
	return null;
}
function attachTabCountUpdateHandler(tab_id) {
	var content = $(getTabBodyId(tab_id));
	var update_tab_count = function(e) { setTimeout(function(){updateTab(tab_id);},250) };
	if (content) {
		content.addEventListener('DOMSubtreeModified',update_tab_count,false);
	}
	update_tab_count();
}
function moveToTab(name,o) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var ret = "";
	var t = addTab(name,o);
	if (t) {
		var tab_id = t.id;
		var content = $(tab_id+"_body");
		if (!content) { ret+="Tab content object not found! "; }
		if (name!=home_tab) { 
			var p = o.parentNode;
			append(content,o); // It's already in the Home tab by default!
			if (o.parentNode==p) {
				ret += "After append(), the posts's parent node is still the same! ";
			}
		}
	}
	else {
		ret += "Tab does not exist after addTab()! ";
	}
	if (PERFORMANCE) { trace_end(arguments.callee); }
	return ret;
}
var tabCountTimers = {};
var show_tab_count = options.get('tab_count');
function updateTab(tab_id) {
	if (show_tab_count) {
		// Try to only update tab counts if it's not in rapid succession
		if (typeof tabCountTimers[tab_id]!="undefined") {
			clearTimeout(tabCountTimers[tab_id]);
		}
		tabCountTimers[tab_id] = setTimeout( function() { updateTabItemCount(tab_id); }, 500 );
	}
}
function updateTabItemCount(tab_id) { 
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var content = $(getTabBodyId(tab_id));
	var c=0,total=0;
	var cn = findStoriesInContainer(content);
	if (cn && cn.length) {
		var L = cn.length;
		// If the user is using the alternate display type, then process visible posts differently
		var is_show_all = false;
		var stream = getStream();
		if (stream && hasClass(stream,"bfb_show_all")) {
			is_show_all= true;
		}
		for (var i=0; i<L; i++) {
			var o = cn[i];
			if (!hasClass(o,"bfb_duplicate") && !hasClass(o,'UIRecentActivity_Stream')) {
				total++;
				if (is_show_all) {
					c++;
				}
				else if (!hasClass(o,'bfb_hidden') && (!hasClass(o,'bfb_read') || hasClass(o,'bfb_new_comments'))) {
					c++;
				}
			}
		}
		html( $(tab_id+"_count"), '(<span class="new">'+c+'</span>/<span class="total">'+total+'</span>)' );
		// Change classes depending on if there are any posts in the tab
		if (c==0) { addClass($(tab_id),"bfb_tab_empty"); } else { removeClass($(tab_id),"bfb_tab_empty"); }
	}
	delete tabCountTimers[tab_id];
	if (PERFORMANCE) { trace_end(arguments.callee); }
}
function hideStory(o) {
	while (o && o.parentNode) {
		if (hasClass(o, storyClass )) {
			removeClass(o,"bfb_new_comments");
			return;
		}
		o = o.parentNode;
	}
}
function getData(o,container) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var data = o.getAttribute(container);
	if (data) {
		var attrs = parse(data,"getDataProperty");
		if (PERFORMANCE) { trace_end(arguments.callee); }
		return attrs;
	}
	if (PERFORMANCE) { trace_end(arguments.callee); }
	return {};
}
function getDataProperty(o,prop,container) {
	return getData(o,container)[prop];
}
function getStoryProperty(o,prop) { return getDataProperty(o,prop,'data-ft'); }
function time() { return +new Date; }

var uniqueStories = {};
var storyTypes = {
 '12,38,94,178': 'Event stories',
 '316': 'Friends being added to Groups',
 '116,278,285': 'Friends checking in (location)',
 '7': 'Friends commenting on photos',
 '21': 'Friends joining groups',
 '313':'Friends starting to play games',
 '68': 'Friends tagged in notes',
 '65': 'Friends tagged in pictures',
 '130': 'Friends tagged in videos',
 '161': 'Page "Likes"',
 '283': 'External (site/link) "Likes"',
 '5,80,263': 'Links',
 '8': 'New friend notifications',
 '66': 'Notes',
 '247,6': 'Photos',
 '237': 'Posts by any application',
 '282': 'Profile Information change',
 '15,60,259': 'Profile Picture changes',
 '10': 'Relationship changes',
 '46,11': 'Status updates',
 '128': 'Status updates by Pages',
 '17': 'Videos',
 '56,273': 'Wall-to-Wall posts'
}

var apps = {233260194406:'Lounge Bar',14465560457:'6 waves Gaming Network',56078883483:'6waves Poker',114440918573776:'Age of Champions',223102214157:'Ameba Pico',99953444729:'Animal Paradise',
50342477628:'Anket',20851133681:'Appbank',17091798008:'Are YOU Interested',3008250443:'Astrology',215779025017:'Baking Life',338051018849:'Baking Life',178091127385:'BandPage by RootMusic',
60884004973:'Barn Buddy',181238248175:'Battle Punks',133306231504:'Be Naughty',113698985309095:'Become the Avatar',40343401983:'Bejeweled Blitz',249071419053:'Big City Life',27178406486:'Biotronic',
425755285303:'Birdland',5437153164:'Birthday Calendar',14852940614:'Birthday Cards',100044563957:'Bite Me',3447538274:'Blingee Book',133860221774:'Bola',8519508606:'Bowling Buddies',
144030170500:'Brain Buddies',124194560873:'Bubble Island',114224881951277:'Bubble Paradise',167633464091:'Bubble Popp',115086491859102:'Bubble Popp 2',6705455684:'BuddyPoke',
2427603417:'Bumper Sticker',22257989976:'Bumper Sticker New',101539264719:'Cafe World',116823891666136:'Casino City',46755028429:'Castle Age',100160675317:'Castle amp Co',2318966938:'Causes',
162065369655:'Chase Community Giving',8278986302:'Circle of Moms',291549705119:'CityVille',100626246643948:'Clobby Group Chat',75510507417:'COLLAPSE',10291197539:'Collect Hearts',62691070599:'Collect Roses',
2433486906:'Compare People',338535090337:'Concerts',5179614317:'Concerts',95936962634:'Contests',26947445683:'Country Life',165747315075:'Country Story',82716374139:'Country Story',
168640034863:'Crazy Cow Music Quiz',48596151436:'Crazy Planets',165375796970:'Create your Quiz',20290140409:'Daily Horoscope',2432011670:'Daily Horoscope',9322309221:'Daily Tarot Cards',
125717634120849:'Death Time Calculator',78222424325:'Decorative Writing',271369798991:'Demande  tes Amis',53714299244:'Do you really know me',2388926799:'Dogbook',9729051194:'Doorbell',
75127329583:'Drink it up',298341310193:'Drinks for All',113719625324737:'EA SPORTS FIFA Superstars',102965689949:'Element Analyst Creator',217680310882:'Entrevista tus Amigos',372268249833:'Evony',
117955111903:'Family Feud',2359239297:'Family Tree',5388815661:'FamilyLinkcom',64571521476:'FARKLE',56748925791:'Farm Town',102452128776:'FarmVille',315888392043:'Fashion World',181988617439:'Ferme Pays',
257873289864:'Fish Friends',154109904146:'Fish Isle',100354007223:'Fish World',151044809337:'FishVille',133911659959418:'Flag Balls World Cup 2010',2372251387:'Flock Browser',11908058186:'Forever Friends',
216274310341:'Formspring',86734274142:'Foursquare',413123837941:'Frases de la vieja de Mierd',102153277223:'Frases Diarias',2610371153:'Friend Block',5655417519:'Friend Hug',326914550570:'Friend Interview',
389195615844:'Friends Emotions Emociones de Amigos',7019261521:'Friends For Sale',83275034265:'Friends Quizzes',201278444497:'FrontierVille',153292069231:'Frosmo',314590221259:'Funfari',
212391322553:'Funflow',94168997876:'Galletas de la fortuna',62181482841:'Games',79389216309:'Gangster City',38278202455:'Garden Life',23438505508:'Geo Challenge',8089123087:'Gift Creator',
65496494327:'Give Hearts',96815041925:'Glamble Poker',127422718290:'Glcksnu',201978810060:'GooBox  Jeux Gratuits',279343665079:'Goobox  Juegos gratis',72396514444:'Good and Evil',2439131959:'Graffiti',
207717314188:'Granja Pas',8331309681:'Hallmark Social Calendar',134920244184:'Happy Aquarium',106265797465:'Happy Farm',57132175859:'Happy Farm',31231052697:'Happy Island',127148832824:'Happy Pets',
7176719309:'Hatchlings',105484376153111:'Hello City',58259641862:'Hero World',2552096927:'Honesty Box',125043264175761:'HootSuite',183319479511:'HootSuite',2339854854:'Horoscopes',
315878856166:'Horse Saga renamed',299672925361:'Hotel City',81708710756:'How Well Do You Know Me',41158896424:'HTC Sense',2345673396:'Hug Me',4673352481:'Hugged',6917629807:'iCast',56456021122:'Icy Tower',
3105775330:'iHeart',6627984866:'iLike this Artist',17604663455:'IQ test',25148877350:'Is Cool',94483022361:'Island Paradise',6307004335:'iSmile',400560945032:'Jeux Flash Gratuits',368596809331:'Jewell Stars',
8725050364:'JibJab',329338272587:'Jumping Dog',87409181318:'Jungle Jewels',119607768061558:'Jungle Jewels  The Adventure',307957522611:'Jungle Life',130402594779:'Kingdoms of Camelot',
92922535871:'La Meteo del Humor',48268916695:'La meteo du moral',92264180565:'LArc en Ciel du Moral',2405948328:'Likeness',99663102846:'Lil Farm Life',48187595837:'LivingSocial',353489950377:'Lovely Farm',
35512920026:'Ma Fiche',10979261223:'Mafia Wars Game',106451196053938:'Mahjong',48912475783:'Mahjong',232279070608:'Mahjongg Dimensions',217638774392:'Mall World',128581025231:'Marketplace',
114750555226259:'Maya Pyramid',38075929120:'Metropolis',315455798286:'Millionaire City',5706713477:'MindJolt Games',2384884864:'MixPod Music Playlist',184736811530:'MMA Pro Fighter',8743457343:'Mob Wars',
112462268161:'Mobsters 2 Vendetta',175763303727:'Monster World',318024301141:'MonstrosCity',14405921260:'MOTOBLUR',2558160538:'Movies',2413267546:'Music',2436915755:'Music',57220127280:'Music Challenge',
58267769762:'My Arabic Name',2405167945:'My Band',17236267818:'My Best Girls',296408696694:'My Casino',226424314329:'My City Life',111884338842047:'My Empire',6224046065:'My Family',2490151219:'My Personality',
2352149512:'My Stuff',151646922090:'My Top Fans',213797292305:'My Town',102680597135:'My Tribe',301568376907:'My Vineyard',155663022639:'Name Analyzer',213568186669:'NanoStar Siege',9953271133:'NetworkedBlogs',
105150252854220:'Nightclub City',137827210650:'Ninja Saga',147198662055:'Ninja Warz',9313288246:'Okey',46194160792:'OndaPix',7326494972:'Online People',349982333921:'Pet Forest Online',11609831134:'Pet Society',
43339618829:'Petites questions entre amis',163576248142:'PetVille',38997159460:'Photobucket',350031875244:'Phrases',96991919724:'phrases 4 fun',346127299384:'Phrases _ F r a z i',15079221211:'Pick who',
2258014869:'Picnik',3396043540:'Pieces of Flair',7068221435:'Pillow Fight',124652482372:'Platinum Life Web Edition BETA',100577877361:'PlayStationNetwork',89515727790:'Plock',47804741521:'Plurk',
188875041752:'Poker Blitz',9727320655:'Poker Palace',20678178440:'Poll',494509405050:'Pool Master',356104976566:'Premier Football',5644329558:'Premier Football',18489293024:'Profile Song',
127854180582810:'Qui veux tembrasser aujourdhui',134386183254140:'Quii veuux  sortiir avecc toii      ',6016992457:'Quiz Creator',7635383700:'Quiz Monster',8525382561:'Quiz Planet',20403127296:'Quizazz',
6071052793:'QuizBone',2341007765:'Quizzes',112682186530:'Quotes Creator',397668330151:'Resort World',43016202276:'Restaurant City',46185617224:'RockFREE',2601240224:'RockYou Live',
89771452035:'Roller Coaster Kingdom',45439413586:'RSS Graffiti',20737309912:'Scavenger Hunt',4014809927:'School of Wizardry',14916117452:'SCRABBLE',7730584433:'SCRABBLE Worldwide excluding US and Canada',
6494671374:'Scramble',126065837432395:'Seni Kimler Takip Ediyor',6459818531:'Show Some Love',4260387428:'Sketch Me',2378983609:'Slide FunSpace',186995688782:'Smiles',20407635301:'Snaptu',
163965423072:'Social City',163098990943:'Social Interview',185050880967:'Social Pang',23798139265:'Social RSS',19935916616:'Songs',8630423715:'Sorority Life',169868688162:'SPP Ranch',
241219935874:'sProphet  Sports Predictions',338375791266:'Starbucks Card',8109791468:'Status Shuffle',57001576911:'Sunshine Ranch',130782229473:'Super Dance',260692711926:'SuperFun Town',2357179312:'SuperPoke',
29591742977:'SuperPoke Pets',160221913381:'Superstar City',113430382004230:'Sweet World',38656534621:'Tarjetitas',18120686907:'Tattoodle',2376198867:'Tetris Friends',2389801228:'Texas HoldEm Poker',
113315295379073:'The Hardest Game of the World',44898431470:'The Mood Weather Report',334201605612:'Tiki Farm',255168890258:'Tiki Resort',2425101550:'Top Friends',187984023512:'Towner',
234860566661:'Treasure Isle',158243717529:'Treasure Madness',29518083188:'Treasure Madness',104656394022:'Trebol de la Suerte',370852557681:'Treetopia',2219089314:'TripAdvisor  Cities Ive Visited',
56849177140:'Trivias Locas  Trivias encuestas y tests',48119224995:'Tumblr',2231777543:'Twitter',33181781021:'UNO',25287267406:'Vampire Wars',122787657740607:'vChatter',10150138245120151:'Verdonia',
2481647302:'Visual Bookshelf',7616635055:'Wedding Buzz formerly Weddingbook',392248091048:'Welcome Tab for pages',2603626322:'Where Ive Been',8827826004:'Who Has The Biggest Brain',101628414658:'Wild Ones',
30713015083:'Windows Live Messenger',10726707410:'Word Challenge',163789865790:'Word Challenge',230265160294:'World at War',130832813611477:'World Cup 2010 Jersey',5747726667:'Xbox LIVE',5243732877:'Yearbook',
82038911142:'Your Japanese Name',160292238168:'Your Luck daily',290797550542:'Yourapps',87741124305:'YouTube',2513891999:'YouTube Box',3801015922:'YouTube Video Box',21526880407:'YoVille',
292329111180:'Zoo Kingdom',339444600959:'Zoo Paradise',167746316127:'Zoo World',6953377468:'Zoos'}

// Read in the custom apps and add them
var custom_apps = trim(options.get('custom_apps'));
if (custom_apps && custom_apps.length>0) {
	custom_apps = custom_apps.split(/\s*,\s*/);
	if (custom_apps && custom_apps.length>0) {
		for (var i=0; i<custom_apps.length; i++) {
			var props = custom_apps[i].split(':');
			apps[''+props[0]] = props[1];
			}
	}
}

var auto_mute_count = options.get('auto_mute_count');
var auto_mute_all = options.get('auto_mute_all');
var filters = options.get('filters');
var reorder = options.get('reorder');
var always_show_tabs = options.get('always_show_tabs');
var tab_all_apps = options.get('tab_all_apps');
var expand_similar_posts = options.get('expand_similar_posts');
var show_post_actions = options.get('show_post_actions');
var processProfiles = options.get('process_profiles');
var filterProfiles = options.get('filter_profiles');
var filters_enabled = options.get('filters_enabled');
var display_control_panel = options.get('display_control_panel');
var open_app_link_in_tab = options.get('open_app_link_in_tab');
var open_app_link_marks_read = options.get('open_app_link_marks_read');
var auto_expand_comments = options.get('auto_expand_comments');
var expand_see_more = options.get('expand_see_more');
var allow_bfb_formatting = options.get('allow_bfb_formatting');
var process_recent_activity = options.get('process_recent_activity');

function addAllTabs(o) {
	addTab(home_tab,o);
	if (filters && filters.length) {
		for (i=0; i<filters.length; i++) {
			filter = filters[i];
			if (filter.actions && typeof filter.actions.move_to_tab!="undefined" && filter.actions.move_to_tab.indexOf("<")!=0) {
				addTab(filter.actions.move_to_tab,o);
			}
		}
	}
	tabs_added = true;
}
function tabs_exist() { return !!$('bf_feed_tabs'); }
var nofbidcount = 0;
var storyCount = 0;
var count_processed = 0;
var count_hidden = 0;
var count_filtered = 0;
var count_tabbed = 0;
var count_expanded = 0;
var count_duplicate = 0;
function fixStory(o,isPageOrProfile,saveprefs) {
	var href = "";
	try { href = window.location.href; } catch(e) { } 
	if (typeof saveprefs=="undefined") { saveprefs = true; }
	
	// If viewing a single wall post, don't process anything!
	if (href.indexOf("story_fbid=")>0 || href.indexOf("share_id=")>0) { return; }
	
	if (PERFORMANCE) { trace_start(arguments.callee); }

	if (always_show_tabs && !tabs_exist() && !isPageOrProfile) {
		addAllTabs(o);
	}

	if (!process_recent_activity && (hasClass(o,"UIRecentActivity_Stream") || hasClass(o,"uiStreamMinistory") || hasClass(o,"UIRecentActivityStory"))) { if(PERFORMANCE){trace_end (arguments.callee);}return; } // Don't process recent activity posts

	// Figure out what class the story body contains
	if (messageContentClass==null) {
		for (var c in messageContentClasses) {
			var els = o.getElementsByClassName(c);
			if (els && els.length) {
				messageContentClass = c;
				break;
			}
		}
	}

	// Create the control panel if it's not already there
	if (display_control_panel) {
		var cp = $('better_fb_cp');
		if (cp==null) { 
			var hs = $('home_stream');
			if (hs!=null) {
				createControlPanel(hs);
			}
			else {
				// If we're on profile/page
				hs = $('profile_stream_container');
				if (hs) {
					createControlPanel(hs);
				}
				else {
					hs = $('profile_minifeed');
					if (hs) {
						createControlPanel(hs);
					}
					else {
						createControlPanel(o.parentNode);
					}
				}
			}
		} else {
			cp.style.display="block"; 
		} 
	}
	
	// Check to see if this post has already been processed
	if (hasClass(o,'bfb_processed')) {
		if (PERFORMANCE) { trace_end (arguments.callee); }
		return; 
	}
	addClass(o,'bfb_processed');
	update_status('bfb_status_processed',++count_processed);
	
	// Get the story properties from the data-ft attribute
	var props = getData(o,"data-ft");
	var type = props.sty || -1;
	
	// If there is no fbid, then we can't uniquely identify this post. We're screwed.
	var fbid = getFbid(o,props);
	if (!fbid || fbid<=1) {
		if (++nofbidcount > 3) {
			showerror("Facebook has delivered content (posts) with no meta-data attached, so Better Facebook could not process the posts. This is a random Facebook glitch. Please reload and hope it goes away, or close this window to ignore it.");
			nofbidcount=0;
		}
		addClass(o,"nofbid");
		if (PERFORMANCE) { trace_end(arguments.callee); }
		return;
	}
	
	// Handle duplicate stories
	if (uniqueStories[fbid]) {
		addClass(o,"bfb_duplicate");
		update_status('bfb_status_duplicate',++count_duplicate);
		return;
	}
	uniqueStories[fbid] = true;

	// Enhance links in application stories
	if (props.app_id && (open_app_link_in_tab || open_app_link_marks_read) && o.querySelectorAll) {
		var links = o.querySelectorAll("a[href*=http\\:\\/\\/apps\\.facebook]");
		for (var i=0; i<links.length; i++) {
			if (open_app_link_in_tab) {
				links[i].target="_blank";
			}
			if (open_app_link_marks_read) {
				bind(links[i],'click',function() { mark_post_read(o,true); });
			}
		}
	}
	
	// Apply filter rules
	var fdebug = "";
	var show_add_app_icon = (typeof props.app_id!="undefined");
	var tabbed = false;
	var filtered = false;
	var hidden = false;
	if (filters_enabled && (!isPageOrProfile || filterProfiles)) {
		// First check if we need to move all app posts
		if (tab_all_apps) {
			if (props.app_id) {
				if (props.app_id in apps) {
					fdebug += moveToTab(apps[props.app_id],o);
					tabbed = true;
					show_add_app_icon = false;
				}
			}
		}
		var i, filter, match, dataft_key, criteria, rule, action;
		if (filters && filters.length) {
			for (i=0; i<filters.length; i++) {
				filter = filters[i];
				match = true;
				for (dataft_key in filter.criteria) {
					criteria = filter.criteria[dataft_key];
					if (dataft_key=="regex") {
						if (typeof criteria=="string" && criteria.indexOf("/")==0) {
							// This is regular expression text, so convert it!
							criteria = convert_string_to_regex(criteria);
						}
						if (typeof criteria=="string") {
							if (!o || !o.innerHTML || o.innerHTML.toLowerCase().indexOf(criteria.toLowerCase())==-1) {
								match = false; break;
							}
						}
						else if (criteria && criteria.test) {
							if (!criteria.test(o.innerHTML)) {
								match = false; break;
							}
						}
						else {
							match = false; break;
						}
					}
					else if (!props[dataft_key] || !(props[dataft_key] in criteria)) {
						match = false; break;
					}
				}
				if (match) {
					fdebug+="Matched filter #"+i+". ";
					filtered = true;
					for (action in filter.actions) {
						if (action=="move_to_tab") {
							// Check for special handlers in tab names
							var tabname = filter.actions[action];
							var app_id = props['app_id'];
							if (tabname=="<app_name>") {
								if (app_id && typeof apps[app_id]!="undefined") {
									tabname = apps[app_id];
								}
								else {
									tabname = "Unknown App";
								}
							}
							fdebug+='Moving to tab ['+tabname+'].';
							fdebug += moveToTab(tabname,o);
							tabbed = true;
							show_add_app_icon = false;
						}
						else if (action=="add_class") {
							addClass(o,filter.actions[action]);
						}
						else if (action=="hide") {
							addClass(o,"bfb_hidden");
							hidden = true;
						}
						else if (action=="minimize") {
							addClass(o,"bfb_minimized");
						}
					}
					if (filter.stop) {
						break;
					}
				}
			}
		}
	}
	if (tabbed) { update_status('bfb_status_tabbed',++count_tabbed); }
	if (filtered) { update_status('bfb_status_filtered',++count_filtered); }

	// Auto-expand the comments
	if (auto_expand_comments) {
		var comment_link = o.querySelector('.commentable_item');
		if (comment_link && o.querySelector('.feedbackBling')) {
			removeClass(comment_link,'collapsed_comments');
			removeClass(comment_link,'hidden_add_comment');
		}
	}
	
	// If there is a grouping of similar posts, click it!
	if (expand_similar_posts) {
		var similar = o.getElementsByClassName(streamCollapsedClass);
		if (similar.length) {
			similar = similar[0].getElementsByTagName('a')[0];
			if (similar) {
				similar.style.backgroundColor = "yellow";
				html( similar, "<strong>AUTO-EXPANDING...</strong>"+similar.innerHTML );
				try {
					clickLinkQueued(similar);
					update_status('bfb_status_expanded',++count_expanded);
				} catch (e) { showerror("Failed on clickLinkQueued! Please report this error!"+e.toString()); }
			}
		}
	}

	// Get the stored data for this post
	var post_data = options.get('story_data.'+fbid);
	if (!post_data) {
		post_data = {};
	}
	
	// Check to see if it's already been marked as read
	if (post_data.read) {
		addClass(o,"bfb_read");
		hidden = true;
	}
	
	// Check to see if it has new comments
	var c = get_comment_container(o);
	var count = get_post_comment_count(o);
	
	// This is tricky. Store the number of comment childNodes of the comment container.
	// If the post has "view all X comments", and you add one, the comment counting code will still see that same number because it's not updated.
	// So we stored the childNode length and compare it later when marking as read. Yuck!
	// cnc = childNodeCount
	post_data.cnc = 0;
	if (c && c.getElementsByClassName) { post_data.cnc = c.getElementsByClassName(comment_class_name).length; }

	// But not if the user has disabled following of comments
	var new_comments_exist = false;
	if (count>0) {
		if (post_data.read && (auto_mute_all || post_data.no_comments || (auto_mute_count>0 && count>auto_mute_count))) {
			addClass(o,"bfb_muted");
		}
		else {
			var t = time();
			var stored_count = 0;
			if (post_data.cc && typeof post_data.cc.c!="undefined") {
				stored_count = post_data.cc.c
			}
			if (post_data.read && (count > stored_count)) {
				addClass(o,"bfb_new_comments");
				hidden = false;
				// Add a new box into the comment area?
				if (c!=null && (o && o.getElementsByClassName && o.getElementsByClassName('bfb_new_comment_notif').length==0)) {
					var new_count = count-stored_count;
					var text = new_count+" new comment"+((new_count>1)?"s":"") + " ("+count+" total)";
					var section = el('div','ufi_section bfb_new_comment_notif',{'innerHTML':text});
					new_comments_exist = true;
					
					// Highlight the new comments
					if (c.childNodes && c.childNodes.length>0) {
						var start = c.childNodes.length - new_count;
						if (start < 0) { start = 0; }
						for (var i=0; i<start && i<c.childNodes.length; i++) {
							var n = c.childNodes[i];
							if (n.id) {
								addClass(n,"better_fb_new_comment_unhighlight");
							}
						}
					}
					// Add the notification
					insertFirst(c,section);
				}
			}
		}
	}

	// Reorder the post to be in correct chronological order?
	var filter = props.filter || '';
	if (reorder) {
		// Record the timestamp of the post as an attribute, based on the timestamp's title attribute
		var post_time = o.getAttribute('timestamp') || 0;
		if (!post_time) {
			var timestamp = o.getElementsByClassName('timestamp');
			if (timestamp && timestamp.length) {
				timestamp = timestamp[0];
				var ts = 0;
				try { 
					ts = new Date(timestamp.getAttribute('data-date'));
					post_time = ts.getTime();
				} catch (e) { }
				o.setAttribute('timestamp',post_time);
			}
		}
	
		var stream = getParentByClass(o,streamContainerClass);
		if (!stream) {
			stream = getParentByClass(o,"bf_stream");
		}
		if (stream) {
			var posts = findStoriesInContainer( stream );
			var L = posts.length;
			for (var i=0; i<L; i++) {
				var p = posts[i];
				var ts = p.getAttribute('timestamp');
				if (ts && ts<post_time) {
					insertBefore(o,p);
					break;
				}
			}
		}
	}
	
	if (hidden) { update_status('bfb_status_hidden',++count_hidden); }

	// Auto-expand the "see more" link 
	if (expand_see_more || (allow_bfb_formatting && (props.actrs=='119314224763738' || props.actrs=='174424289341'))) {
		// There are two different formats for "see more"
		QSA(o,'.text_exposed_root',function(div) {
			var hidden_html = QS(div,'.text_exposed_show','innerHTML');
			if (hidden_html) {
				QSA(div,'.text_exposed_hide,.text_exposed_show',function(span){ removeChild(span); });
				appendhtml(div,hidden_html);
			}
		});
		QSA(o,'.UIStory_Message',function(span) {
			var hidden_content = QS(span,'.text_exposed_show','innerHTML');
			if (hidden_content) {
				QSA(o,'.text_exposed_link',function(span){ removeChild(span); });
				QSA(span,'.text_exposed_hide,.text_exposed_show',function(span){ removeChild(span); });
				appendhtml(span,hidden_content);
			}
		});
	}

	// Add the post action tray
	if (show_post_actions) {

		var mark_post_unread = function(o,fbid,a) {
			delete post_data.read;
			delete post_data.cc;
			options.set('story_data.'+fbid,post_data);
			removeClass(o,"bfb_read");
			removeClass(o,"bfb_new_comments");
			a.parentNode.removeChild(a);
		}

		o.style.position="relative";
		var pcp = '<div class="bfb_post_action_container_inner">';
		var mark_read_desc = "Mark Read: Mark this post as read and hide it until/unless new comments are posted";
		if (post_data.read) {
			mark_read_desc = "Mark Read: Update the stored comment count for this post, mark it as read, and hide it again.";
		}
		pcp += '		<div class="bfb_post_action bfb_post_action_read" title="'+mark_read_desc+'">&nbsp;</div> ';
		var mute_desc = "Mute Comments: mute this post so new comments will not be shown.";
		if (!new_comments_exist) {
			mute_desc = "Mark Read and Mute: Mark this post as read and mute any future comments";
		}
		pcp += '<div class="bfb_post_action bfb_post_action_mute" title="'+mute_desc+'">&nbsp;</div>';
		pcp += '<div class="bfb_post_action bfb_post_action_unread" title="Mark Unread: mark this post as unread so it shows up in your feed again.">&nbsp;</div>';
		if (show_add_app_icon) {
			pcp += '<div class="bfb_post_action bfb_post_action_add" title="Add App: add this application to your list of known apps. (It will then be automatically tabbed by name if that feature is enabled).">&nbsp;</div>';
		}
		pcp += '<div class="bfb_post_action bfb_post_action_google" title="Google It!">&nbsp;</div>';		
		pcp += '<div class="bfb_post_action bfb_post_action_info" title="Post Info: View debug information about this post and how it was processed. Useful for debugging or reporting problems!">&nbsp;</div>';
		
		pcp += '</div>';
		var d = el('div','bfb_post_action_container',null,null,pcp);
		bind( $first(d,'bfb_post_action_add'),'click',function(e) {
			try {
				var appname = null;
				if (o.querySelector) {
					// This is the old way of identifying an application. Left here just in case it comes back.
					var applinks = o.querySelectorAll("a[href*=application\\.php\\?id\\=]");
					for (var j=0; j<applinks.length; j++) {
						if (applinks[j].getElementsByTagName("IMG").length==0) {
							appname = applinks[j].innerHTML.replace(/[,:'"\<\>\&\*\@\$]/g,'');
						}
					}
					if (!appname) {
						appname = prompt("What would you like to label this application? (This is also the name of the tab where it will appear if you have the option set to automatically send known apps to tabs)","");
					}
					if (appname) {
						if (custom_apps.length>0) { custom_apps+="," };
						custom_apps += props.app_id+':'+appname;
						options.set('custom_apps',custom_apps);
						apps[props.app_id] = appname;
						moveToTab(apps[props.app_id],o);
					}
				}
			}
			catch(e) { }
		} );
		bind( $first(d,'bfb_post_action_mute'),'click',function(e) { 
			options.set('story_data.'+fbid+'.no_comments',true);
			if (!new_comments_exist) {
				mark_post_read(o,true);
			}
			if (options.get('hide_when_muted')){
				hideStory(this);
			}
		} );
		bind( $first(d,'bfb_post_action_read'),'click',function(e) { mark_post_read(o,true); } );
		bind( $first(d,'bfb_post_action_unread'),'click',function(e) { mark_post_unread(o,fbid,e.target); } );
		bind( $first(d,'bfb_post_action_info'),'click',function(e) { toggleClass(o,'post_debug') } );
		bind( $first(d,'bfb_post_action_google'),'click',function(e) { google_it(o); } );
		insertFirst(o,d);
	}
	
	// Add debug info to the story
	var dd = el('div','debug');
	dd.style.display="none";
	var c = _template("<b>fbid</b>=%1%, <b>type=%2%</b>, <b>post_data</b>=%3%, <b># Comments found</b>=%5%, <b>className</b>='%4%'",fbid,type,JSON.stringify(post_data), o.className, count);
	var dataft = o.getAttribute('data-ft');
	if (dataft) { c+="<br><b>data-ft</b>:"+ dataft.replace(/,/g,", "); }
	if (fdebug) { c+="<br><b>Filter Debug:</b>"+fdebug; }
	html( dd, c );
	append(o,dd);
	
	if (PERFORMANCE) { trace_end(arguments.callee); }
}

function google_it(o) {
	var q = QS(o,'.messageBody','innerHTML');
	if (!q) { q = QS(o,'.UIStory_Message','innerHTML'); }
	if (!q) { q = QS(o,'.uiStreamMessage','innerHTML'); }
	if (q) {
		// Clean up the source
		q = q.replace(/^\s*<span.*?<\/span>/," ");
		q = q.replace(/<.*?>/g," ");
		q = q.replace(/[^\w\d\s\_\-\.]/g,' ');
		q = q.replace(/\s+/g,' ');
		q = trim(q);
		q = q.replace(/ /g,"+");
		window.open("http://google.com/search?q="+q);
	}
	else {
		alert("Couldn't find post message content, sorry!");
	}
}

// Get the container where comments are stored
function get_comment_container(o) {
	return $first(o,feedCommentClass);
}
// Get the count of how many comments a post has
var comment_class_name = 'uiUfiComment';
function get_post_comment_count(o,cnc) {
	var c = get_comment_container(o);
	var new_comment_count = 0;
	if (c) {
		if ( /view all ([,.\d]+) comments/i.test(c.innerHTML) ) {
			var view_all_count = +(RegExp.$1.replace(/[,.]/g,""));
			// If a ChildNodeCount is passed, compare it to the current CNC to see if the "view all" count is unreliable
			if (typeof cnc!="undefined") {
				var comments = c.getElementsByClassName(comment_class_name);
				if (comments && comments.length>cnc) {
					// We need to do some math!
					// # new comments = new CNC - old CNC
					new_comment_count = +(comments.length - cnc);
				}
			}
			return view_all_count + new_comment_count;
		}
		var comments = c.getElementsByClassName(comment_class_name);
		if (comments && comments.length>0) {
			return comments.length;
		}
		return c.childNodes.length || 0;
	}
	return 0;
}

// Mark an individual post as "read"
function mark_post_read(o,save) {
	if (typeof save!="boolean") { save=false; }
	var t = time();
	var fbid = getFbid(o,getData(o,"data-ft"));
	if (fbid && !hasClass(o,"bf_duplicate")) {
		var post_data = options.get('story_data.'+fbid) || {};
		post_data.read = t;

		var cc = post_data.cc || {};
		cc.c = get_post_comment_count(o,post_data.cnc);
		if (post_data.cnc) {
			delete post_data['cnc'];
		}
		cc.t = t;
		if (cc.nt) { delete cc['nt']; }
		if (cc.nc) { delete cc['nc']; }
		post_data.cc = cc;

		options.set('story_data.'+fbid,post_data,save);
		addClass(o,"bfb_read");
		removeClass(o,"bfb_new_comments");
	}
}

function fixStories(o,isPageOrProfile) { 
	if (PERFORMANCE) { trace_start(arguments.callee); }
	// We are processing a live list. If we move a post to a tab, that changes the list!
	// So instead, copy all posts to an array first, then process each one
	if (o && o.length) {
		var posts = [];
		for (var i=0; i<o.length; i++) {
			posts.push(o[i]);
		}

		for (var i=0; i<posts.length; i++) {
			fixStory(posts[i],isPageOrProfile,false);
		}
		options.save();
	}
	if (PERFORMANCE) { trace_end(arguments.callee); }
}
function findStoriesInContainer(container) {
	if (container && container.getElementsByClassName) {
		return container.getElementsByClassName(storyClass);
	}
	return null;
}
var olderPostsClickCount=0;
var maxOlderPostsClickCount = +options.get('auto_click_more_times') || 0;
var mark_read_on_comment = options.get('mark_read_on_comment');


// Add an Options button in the header
onIdLoad('pageNav',function(nav) {
	if ($('bf_options_button')==null) {
		var src = "data:image/gif,GIF89a%17%00%16%00%D5%00%00%00%00%00%FF%FF%FFbz%AD%D7%0C%10%E2pr%D648%D1LP%CB%16%1F%BB%1C(%BA%2B9%A4%234%9C-E%AB%40Y%BA%5Er%875R%88%40%60g0P%96o%93vMufBf%B1%A5%B8qX%84I%3FfUQ%7Cok%94%87%8A%ABWe%8F%3CMv(%3Bg%3ER~CV%7F0CkLi%A6BY%896Iph%84%B7%A5%BC%E4%3CZ%8Dq%92%C8%82%A1%D3%86%A6%D9%8F%B0%E5%8D%AB%DD%91%AE%DF%B0%C0%D9%3Cf%A6%C8%D5%E91T%83y%A3%DB%83%AB%DF%8F%B2%DE%D4%DA%E0%E7%EA%ED%F8%FA%FB%FD%FF%FF%FB%FD%FD%F9%FC%F9%FC%DC%DA%E2%1F%1F%E5BB%EC%95%95%F3%C2%C1%F9%ED%ED%FD%FD%FD%2C%00%00%00%00%17%00%16%00%00%06%FF%40%81pH%2C%1A%87%1A%8E%F2%C3l29%22M%26%83Iz%84%1B%CEG%C4%DDx%BD%D1Y%60%1C%C0y8%D8m%D7%DBiw%C4%E4%00M%F4I%8B%D8%1D%8F%BE%A3%B1%8D%7D%3D%04%3B%0Au%02%1Ewmz!!%25%25%18%3D%3C%04%06%0A%10%16%10%0AB%87y%8C%25!%17%0F%0B%09%04%3C9%14%2F%13%0E%2F%98%86%2F%9D%17%13%A0%0E%0F%15%19%80%3C%05%08%0A%07%2F%10%3C%02%AF%B2%0A%0F%12%1A%1A%18%04%04%05%3B%3C%3A%3A%3C%07%17%10%06%02%0A%0B%12!%C5%12%0A%08%09%3A%C8%05%CC%A2%04%13%1D%05%0D%16%2F%9F%12%07%09%0C%03%19%82%3D%03%3D%3B%06%05%04%10%2F%09%06%1E%16%03%07%0B%B6U8%20%A1%82%8E%1C%3Av%10pp%A1%04%2F%03%06%2C%9480%20%C1%82%01%1A%16%2Ch%81%A0%87G%16!P)%C0%C4%03B%8B%05%07%00%0E%B0%F6%A0%C5%08%5B%93%AC5%14%D0%C3%A4%84%01%08%24H%C0%00%02%83%04%7F%06%C8xP%00%D1%A2h%09!%09%8AV%00%01%A2%C2%83%04%09%1ED%F01%86E%0B%A6-%8E%0Ax%E0%20%C2%03%06%06%1AD%C8%00%03%86%0C%3F%01%5C%98X%3B%02%84%90%11%11%1A4%C8%A0%22%85%DD%15*H%FC%18%E3%E2%04%8A%13'%86%8C(%9BB%85%E1%15%88%F3%EEM%0B%18%F0%88%B7~Q%1C%5Ea7%85%5E%BE(%FE%A2x%2C%60%84%89%CC%86%2B%DB%25Q%E3%C6%0D%17%99Q%98%E0%7C%A4%F5%91%20%00%3B";
		var a = el('a',null,{href:'#',title:'Better Facebook! Options',id:'bf_options_button'},{click:function() { better_fb_options(); return false; }},'<img id="bf_options_button_icon" src="'+src+'" style="float:left;margin-right:5px;"> Options');
		if (options.get('highlight_cp')) {
			a.style.backgroundColor = "yellow";
			a.style.color = "black";
		}
		var li = el('li');
		append(li,a);
		insertFirst(nav,li);
	}
});

onIdLoad('jewelBoxNotif',function(notifications) {
	var pinned = false;
	// PIN NOTIFICATIONS
	if (options && options.get('pin_notifications')) {
		notifications.style.position="fixed";
		notifications.style.top="40px";
		notifications.style.right="0px";
		notifications.style.display="block";
		notifications.style.left="auto";
		var w = options.get('pin_notifications_width');
		if (w && w!="") {
			notifications.style.width=w;
		}
		pinned = true;
	}
	else if (options && options.get('pin_notifications_right_panel')) {
		var rc = $('rightCol');
		if (rc) { insertFirst(rc,notifications); pinned=true; }
	}
	if (pinned) {
		onIdLoad('jewelNotif',function(o) {
			var clickNotifs = function() { 
				clickLink(o); clickLink(o); 
				if (QS(notifications,'#presence_notifications_loading') || QS(o,'span.jewelCount span','innerHTML')>0) {
					setTimeout(clickNotifs,500);
				}
			}
			clickNotifs();
		});
	}

	if (options && options.get('show_notification_previews')) {
		// Add hovering features
		var retrieving_preview = null;
		var preview_top=0, preview_left=0;
		var preview_window = null;
		var preview_content = {};
		var hide_notif_preview = function() {
			if (preview_window!=null) {
				preview_window.style.display="none";
				retrieving_preview = null;
			}
		}
		var show_notif_preview = function(content) {
			if (preview_window==null) {
				preview_window = document.createElement("div");
				preview_window.className="bfb_notif_preview";
				append(document.body,preview_window);
			}
			html(preview_window,content);
			preview_window.style.display="block";
			position_notif_preview();
		}
		var position_notif_preview = function() {
			if (preview_window!=null) {
				preview_window.style.top = preview_top+10+"px";
				if (preview_left+preview_window.offsetWidth>document.body.offsetWidth) {
					preview_window.style.left = preview_left-10-preview_window.offsetWidth+"px";
				}
				else {
					preview_window.style.left = preview_left+10+"px";
				}
			}
		}
		var scrollhandler = function(e) {
			if (preview_window!=null) {
				var distance = e.detail || e.wheelDelta || 0;
				if (e.wheelDelta) { 
					var newScrollTop = preview_window.scrollTop + (-(distance/3));
				}
				else {
					var newScrollTop = preview_window.scrollTop - (-(distance/3))*20;
				}
				if (newScrollTop<0) { newScrollTop = 0; }
				preview_window.scrollTop = newScrollTop;
				e.preventDefault();
				e.stopPropagation();
			}
		}
		var clicked = false;
		notifications.addEventListener('click',function(){clicked=true;hide_notif_preview();},true);
		bind(notifications,'DOMMouseScroll',scrollhandler );
		bind(notifications,'mousewheel',scrollhandler );
		bind(notifications,'mousemove',function(e) {
			if (clicked){return;}
			var t = e.target;
			if (!t) { return; }
			preview_top = e.pageY;
			preview_left = e.pageX;
			while (t.tagName!="A" && t.id!="jewelNotifs" && t.parentNode) {
				t=t.parentNode;
			}
			if (!t) { return; }
			if (t.tagName && t.tagName=="A") {
				var url = t.href.replace(/http:/, parent.location.protocol);
				var type = null;
				if (url.indexOf("photo.php")>-1) { type="photo"; }
				if (url.indexOf("permalink.php")>-1 || url.indexOf("notif_t=feed_comment")>-1) { type="permalink"; }
				if (type) {
					if (retrieving_preview!=url) {
						retrieving_preview = url;
						if (typeof preview_content[url]=="undefined") {
							var preview_html = '<div class="bfb_notif_preview_message">Use your scroll wheel to scroll down if necessary</div>';
							show_notif_preview("Loading preview...");
							if (type=="photo") {
								fetch_content_in_iframe(url,'content',function(content) {
									if (content) {
										var img = content.querySelector('#myphoto');
										var comments = content.querySelector('#photocomment');
										if (img) {
											preview_html += '<img class="bfb_notif_photo_preview" src="'+img.src+'" style="max-height:'+options.get('preview_img_max_height2')+'px;max-width:'+options.get('preview_img_max_width2')+'px;">';
										}
										if (comments) {
											preview_html += '<br>'+comments.innerHTML;
										}
										preview_content[url] = preview_html;
										if (url==retrieving_preview) {
											show_notif_preview(preview_html);
										}
									}
									else if (url==retrieving_preview) {
										show_notif_preview("Error retrieving preview");
									}
								});
							}
							else if (type=="permalink") {
								fetch_content_in_iframe(url,'content',function(ca) {
									if (ca) {
										var post = ca.querySelector('.storyContent');
										if (post) {
											preview_html += post.innerHTML;
											preview_content[url] = preview_html;
											if (url==retrieving_preview) {
												show_notif_preview(preview_html);
											}
										}
									}
									else if (url==retrieving_preview) {
										show_notif_preview("Error retrieving preview");
									}
								});
							}
						}
						else { show_notif_preview(preview_content[url]); }
					}
					else { position_notif_preview(); }
				}
				else { hide_notif_preview(); }
			}
		});
		bind(notifications,'mouseout',function(e) {
			var t = e.target;
			if (!t) { return; }
			while (t.tagName!="A" && t.id!=notifications.id && t.parentNode) { t=t.parentNode; }
			if (!t||t.tagName!="A") { hide_notif_preview(); }
			else {
				// Check to see if we've moved quickly to something outside our container
				if (t=e.relatedTarget) {
					while (t.id!=notifications.id && t.parentNode) { t=t.parentNode; }
					if (!t || t.id!=notifications.id) {
						// We've gone outside the container, so hide
						hide_notif_preview();
					}
				}
			}
		});
	}
});

function getStream() {
	var s;
	if (processProfiles) {
		if (s=$('profile_minifeed')) { return s; }
	}
	var tab_content = document.querySelector('.bf_tab_body_selected');
	if (tab_content) { 
		return tab_content; 
	}
	if (s=$('home_stream')) { return s; }
	s = document.getElementsByClassName(streamContainerClass);
	if (s && s.length) { return s[0]; }
	trace("No stream found!");
	return null;
}
var comment_expire_time = 1000 * 60 * 60 * 24 * options.get('comment_expire_days'); 

function getFbid(o,props) {
	// Some stories change their fbid, so we need to remembers the actrs involved to uniquely identify it
	if (props && (props.sty==15 || props.sty==60 || props.sty==10 || props.sty==313 || props.sty==263 || props.sty==316)) {
		var id = "";
		// Return the actrs instead, which can unfortunately be in random, comma-separated order
		if (props.actrs && props.actrs.split) {
			var actrs = props.actrs.split(/\s*,\s*/).sort( function(a,b) { return (a>b)?1:-1; } ).join(",");
			id+= "sty"+props.sty+":"+actrs;
			if (props.object_id) {
				id+=":"+props.object_id;
			}
			if (props.pub_time) {
				id+=":"+props.pub_time;
			}
			return id;
		}
	}
	if (props && props.fbid) { 
		return props.fbid; 
	}
	var fbid = getStoryProperty(o,'fbid');
	if (!fbid && o.id) {
		var parts = o.id.split("_");
		if (parts) {
			fbid = parts[parts.length-1];
		}
	}
	return fbid;
}
function process_visible_posts(func) {
	var stream = getStream();
	if (stream) {
		removeClass(stream,"bfb_show_all");
		var posts = findStoriesInContainer(stream);
		for (var i=0, L=posts.length; i<L; i++) {
			var o = posts[i];
			if (!hasClass(o,'bfb_hidden') && (!hasClass(o,'bfb_read') || hasClass(o,'bfb_new_comments'))) {
				func(o);
			}
		}
	}
}
function markRead() {
	trace("Mark All Read clicked");
	process_visible_posts(function(o) {
		mark_post_read(o,false);
	});
	clean_prefs();
	scroll_to_top();
}
function mute_all() {
	trace("Mute All Read clicked");
	process_visible_posts(function(o) {
		var fbid = getFbid(o,getData(o,"data-ft"));
		options.set('story_data.'+fbid+'.no_comments',true,false);
		mark_post_read(o,false);
	});
	clean_prefs();
	scroll_to_top();
}
function scroll_to_top() {
	// Scroll back to the top
	if (document.documentElement) {
		document.documentElement.scrollTop = 0;
	} else if (document.body) {
		document.body.scrollTop = 0;
	}
}
function clean_prefs() {
	// Prune the old comment counts so the prefs don't get huge
	var t = time();
	var pruned_count = 0;
	var story_data = options.get('story_data');
	if (story_data) {
		for (var s in story_data) {
			var story = story_data[s];
			var cc = story.cc;
			if (cc && cc.t) {
				// First copy any new counts to the current counts
				if (cc.nt) { cc.t = cc.nt; delete cc['nt']; }
				if (cc.nc) { cc.c = cc.nc; delete cc['nc']; }
				// This is the new format
				if (t-cc.t > comment_expire_time) {
					delete story_data[s];
					pruned_count++;
				}
			}
			else if (t-story.read > comment_expire_time) {
				delete story_data[s];
				pruned_count++;
			}
			// Get rid of junk cnc props
			if (typeof story['cnc']!="undefined") {
				delete story['cnc'];
			}
			// If there are no story properties, get rid of it
			var prop_count = 0;
			for (var p in story) { prop_count++; }
			if (!prop_count) {
				delete story_data[s];
			}
			
		}
		options.set('story_data',story_data,false);
		if (pruned_count) { trace("Pruned "+pruned_count+" old story comment counts"); }
		options.save();
	}
	return pruned_count;
}
function toggle_show_all() {
	var el = getStream();
	if (el) { toggleClass(el,"bfb_show_all"); }
}
function show_donate_popup(id,content) {
	var footer = el('div');
	var ok = el('span','better_fb_close',{innerHTML:'OK'},{click:function() { options.set('last_msg',id); removeChild(getParentByClass(this,'bfb_dialog')); } } );
	var no = el('span','better_fb_close',{innerHTML:'No Thanks'},{click:function() { options.set('last_msg',id); removeChild(getParentByClass(this,'bfb_dialog')); } } );
	var later = el('span','better_fb_close',{innerHTML:'Ask Me Later!'},{click:function() { options.set('installed_on',time()); removeChild(getParentByClass(this,'bfb_dialog')); } } );
	append(footer,ok);
	append(footer,no);
	append(footer,later);
	show_dialog(content,null,null,footer);
};

function createSidebarSection(o) {
	if (PERFORMANCE) { trace_start(arguments.callee); }
	var d = el('div','better_facebook_sidebar_section');
	d.id="pagelet_"+o.id;
	
	// Check to see if it should be collapsed by default
	var pagelets = options.get('pagelet_collapsed');
	if (pagelets) {
		if (typeof pagelets[d.id]!="undefined" && pagelets[d.id]) { d.className="bfb_pagelet_closed"; }
	}
	
	var h = ''+
	'<div>'+
'		<div class="mbl">'+
'			<div class="uiHeader uiHeaderBottomBorder uiSideHeader mbm pbs">'+
'				<div class="clearfix uiHeaderTop">'+
'					<div>'+
'						<h4 class="uiHeaderTitle pagelet_title">%title%</h4><span id="%id%_title_after"></span>'+
'					</div>'+
'				</div>'+
'			</div>'+
'			<div class="UIRequestBox">'+
'				<div id="%id%" class="UIImageBlock clearfix UIRequestBox_Request UIRequestBox_RequestFirst UIRequestBox_RequestOdd">'+
'					%content%'+
'				</div>'+
'			</div>'+
'		</div>'+
	'</div>';
	html( d, _template( h, o ) );
	
	if (o.links) {
		o.links.forEach( function(link,i) {
			var dd = d.getElementsByClassName('uiHeaderTop')[0];
			if (dd) {
				var a = el('a','bf_sidebar_header_link',{href:'#',innerHTML:link.linktext},{click:link.linkonclick});
				var nd = el('div','uiTextSubtitle uiHeaderActions rfloat');
				append(nd,a);
				insertFirst(dd,nd);
			}
		} );
	}
	if (PERFORMANCE) { trace_end(arguments.callee); }
	return d;
}
function ago(when,now) {
	var diff = Math.floor((now-when)/1000/60);
	if (diff<60) { return diff+" minutes ago"; }
	diff = Math.floor(diff/60);
	if (diff<24) { return diff+" hours ago"; }
	diff = Math.floor(diff/24);
	return diff+" days ago";
}

// When the page is first loaded, process the stuff that is there
fixStories( findStoriesInContainer($('home_stream')), false );
if (processProfiles) {
	fixStories( findStoriesInContainer($('profile_minifeed')), true );
}

/*UPDATECHECK*/
// Check for updates any time there is a contentArea
onIdLoad('contentArea',checkForUpdate);
/*/UPDATECHECK*/

// RIGHT COLUMN CONTENT
// ====================
onIdLoad('rightCol',function(o) {
	var feed_right_column = o;
	if ($('pagelet_chbox')!=null) { feed_right_column=$('pagelet_chbox').parentNode; }
	else if ($('pagelet_adbox')!=null) { feed_right_column=$('pagelet_adbox').parentNode; }
	
	if (options && options.get('pagelet_toggle')) {
		$tagname(o,"h4",function() { this.title="Click to expand/collapse this pagelet"; });
		
		// Handle clicks on pagelet titles
		bind(o,'click',function(e) {
			var el = e.target;
			if (el.tagName=="H4") {
				var pagelet = el.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
				if (pagelet.id) {
					toggleClass(pagelet,"bfb_pagelet_closed");
					options.set("pagelet_collapsed."+pagelet.id,hasClass(pagelet,"bfb_pagelet_closed"));
				}
			}
			// Allow collapsing of Notifications if put into right col
			if (el.tagName=="H3") {
				var pagelet = el.parentNode.parentNode.parentNode.parentNode;
				if ("jewelBoxNotif"==pagelet.id) {
					toggleClass(pagelet,"bfb_pagelet_closed");
					options.set("pagelet_collapsed."+pagelet.id,hasClass(pagelet,"bfb_pagelet_closed"));
				}
			}
		});
		// Collapse pagelets by default
		var id,pagelets = options.get('pagelet_collapsed');
		if (pagelets) {
			for (id in pagelets) {
				if (pagelets[id]) { 
					var el=$(id);
					if (el) {
						addClass(el,"bfb_pagelet_closed");
					}
				}
			}
		}
	}
	
	// Friend Tracker
	// --------------
	(function() {
		try {
			if (options && options.get('show_friend_tracker')) {
				trace("Adding Friend Tracker");
				var clear = function() {
					options.set('friend_tracker.unfriended',{});
					loadContent();
				}
				var loadContent = function(force) {
					var t = time();
					html( $('better_fb_friend_tracker_pagelet'), "Loading..." );
					get_remote_content('typeahead', function(result) {
						var friends = options.get('friend_tracker') || {'friends':{},'unfriended':{}};
						if (typeof friends.friends=="undefined") { friends.friends={}; }
						if (typeof friends.unfriended=="undefined") { friends.unfriended={}; }
						var old_friends = friends.friends;
						var unfriended = friends.unfriended;
						var count = 0;
						var friend_list = parse(result.substring(9),"Friend Tracker");
						if (!friend_list.payload || !friend_list.payload.entries) { trace("Friend tracker returned invalid data!"); return false; }
						friend_list = friend_list.payload.entries;
						trace("Friend list length="+friend_list.length);
						if (friend_list && friend_list.length>5) {
							var current_friends = {};
							for (i=0;i<friend_list.length;i++) {
								if (friend_list[i].ty=="u") { // only users
									count++;
									var id = friend_list[i].i;
									var name = friend_list[i].t;
									var f = {'name':name,'added':t};
									// User wasn't my friend before
									if (typeof old_friends[id]=="undefined") {
										// Add them into the list of my friends!
										old_friends[id] = f;
									}
									// Maintain a list of all current friends
									current_friends[id] = f;
									// Forcefully delete any unfriends who are now friends
									delete unfriended[id];
								}
							}
							trace("Current # friends="+count);

							// Now loop through all my old_friends, to see if they no longer exist in current_friends
							var h = "";
							for (var id in old_friends) {
								if (typeof current_friends[id]=="undefined") {
									// They unfriended you! Bastards!
									unfriended[id] = old_friends[id];
									unfriended[id].deleted = t;
									delete old_friends[id];
								}
							}
							var days = options.get('friend_tracker_duration') || 3;
							var duration = 1000*60*60*24*days;
							for (var id in unfriended) {
								var f = unfriended[id];
								if (t-f.deleted > duration ) {
									delete unfriended[id];
								}
								else {
									h += '&nbsp;&nbsp;&nbsp;<a href="/profile.php?id='+id+'">'+f.name+'</a> <span class="'+timestampClass+'">'+ago(f.deleted,t)+'</span><br>';
								}
							}
							if (h) {
								h = "You are no longer friends with:<br>"+h;
								h += "<br>(Note: Occasionally Facebook will report incorrect data to this script, and the users above are actually still your friend. Please verify the data above by clicking on the friend's name.)";
							}
							else {
								h = "No activity (When you are unfriended, names will show up here)";
							}
							html( $('better_fb_friend_tracker_pagelet'), h );
							
							// Update total friend count
							html( $('better_fb_friend_tracker_pagelet_title_after'), " ("+count+" friends)" );
							
							// Finally, save the details!
							options.set('friend_tracker',friends);
						}
					},null,force);
				}
				
				// Only insert if it doesn't already exist!
				if ($('better_fb_friend_tracker_pagelet')==null) {
					// A "Friend Tracker" sidebar will notify if anyone unfriended you
					insertAtPosition( feed_right_column, createSidebarSection({ title:'Friend Tracker',content:'Loading...',id:'better_fb_friend_tracker_pagelet',links:[ {linktext:'Clear',linkonclick:clear }, {linktext:'Refresh',linkonclick:function(){loadContent(true);} } ] } ), 2 );
					onIdLoad('better_fb_friend_tracker_pagelet',loadContent);
				}
			}
		} catch(e) { showerror("Friend Tracker Error",e.toString()); }
	})();

	// My Group Activity
	// -----------------
/*
	if (options && options.get('show_group_activity') && document.querySelectorAll) {	
		try {
			trace("Adding My Group Activity");
			var load_group_activity = function(force) {
				load_remote_content('group_activity',$('better_fb_groups_pagelet'),function(d) {
					if (typeof d=="string") { return d; } // If passed cached content, just return it!
					var content = "";
					if (d && d.querySelectorAll) {
						var divs = d.querySelectorAll("#contentArea .uiList .objectListItem .UIImageBlock_Content");
						if (divs && divs.length>0) {
							for (var j=0; j<divs.length; j++) {
								$first(divs[j],'uiTextHighlight',function(u) {
									content += '<h4 class="bf_h4">'+u.parentNode.firstChild.innerHTML+'</h4><span class="bf_update">'+u.innerHTML+'</span>';
								})
							}
						}
					}
					return content;
				},"Loading...","No Activity",force);
			};
			// Only insert if it doesn't already exist!
			if ($('better_fb_groups_pagelet')==null) {
				insertAtPosition( feed_right_column, createSidebarSection({ title:'My Group Activity',content:'Loading...',id:'better_fb_groups_pagelet',links:[ {linktext:'Refresh',linkonclick:function() { load_group_activity(true); } } ]} ), 2 );
				load_group_activity();
			}
		} catch(e) { showerror("My Groups Activity Error",e.toString()); }
	}
*/
	
	// Friend Activity
	// -----------------
	(function() {
		// Only insert on home screen
		if (!QS(document,'body.home')) { return; }
		try {
			if (options && options.get('show_friend_activity') && document.querySelectorAll) {	
				trace("Adding Friend Activity");
				var last_seen = options.get('friend_activity_last_seen');
				var new_last_seen = last_seen;
				var debuginfo = debugmsg("Last Seen: "+last_seen);
				
				// Define the function that does the loading
				var loadContent = function(force) {
					var contentArea = $('better_fb_friends_pagelet');
					html( contentArea, "Loading..." );
					var iframe = document.createElement('iframe');
					iframe.className="bfb_iframe";
					var url = remote_content.friend_activity.url;
					iframe.src = url;
					iframe.addEventListener('load',function(e) {
						var d = e.target.contentDocument;
						var process = function(container) {
							var h = "";
							if (container==null) {
								h = "A Facebook error occured while loading content. Hopefully they will fix this soon! (This is not a BFB error). Src: <a href=\""+url+"\">"+url+"</a>";
							}
							else {
								if (d && d.querySelectorAll) {
									// For each friend, get their name and what was updated
									var names = d.querySelectorAll(".friendsDashboard .objectListItem .uiTextTitle a");
									var updates = d.querySelectorAll(".friendsDashboard .objectListItem .auxiliary span.highlight");
									var times = d.querySelectorAll(".friendsDashboard .objectListItem .auxiliary .timestamp");
									var pics = d.querySelectorAll(".friendsDashboard .objectListItem .img");
									var show_pics = options.get('friend_activity_show_pics');
									var show = true;
									var hide_text = options.get('friend_activity_hide_text');
									for (var j=0; j<names.length; j++) {
										var unique = trim(names[j].innerHTML)+"/"+trim(updates[j].innerHTML);
										if (j==0) {
											// Record the most recent one in case of "clear"
											new_last_seen = unique;
											debuginfo += debugmsg("New Last Seen:"+new_last_seen);
										}
										if (last_seen && last_seen==unique) {
											show = false;
										}
										var update = updates[j].innerHTML;
										var show_this = show;
										var debug_class = "";
										if ( hide_text && (new RegExp(hide_text,"i").test(update))) {
											show_this = false;
										}
										if (!show_this && DEBUG) {
											debug_class="debug_small";
											show_this = true;
										}
										if (show_this) {
											var pic = (show_pics)?'<img src="'+pics[j].src+'" class="bf_friend_activity_img">':'';
											h += _template('<div class="bf_clear %6%">%5%<h4 class="bf_h4"><a href="%1%">%2%</a></h4>&nbsp;&nbsp;&nbsp;&nbsp;<span class="bf_update">%3%</span> - <span class="'+timestampClass+'">%4%</span></div>', names[j].href, names[j].innerHTML, update, times[j].innerHTML, pic, debug_class);
										}
									}
								}
							}
							if (!h) {
								h = "No activity";
							}
							options.load();
							options.set('friend_activity_content',h,false);
							options.set('friend_activity_last_update',time(),false);
							options.save();

							// Remove the iframe
							if (iframe && iframe.parentNode) { iframe.parentNode.removeChild(iframe); }

							html( contentArea, ((DEBUG)?debuginfo:"")+h );
						}
						onElementContent('pagelet_friends',process,d);
					},false);
					var pagelet = $('better_fb_friends_pagelet');
					if (pagelet) {
						append(pagelet,iframe);
					}
				}
				var clear = function() {
					last_seen = new_last_seen;
					options.load();
					options.set('friend_activity_last_seen',new_last_seen,false);
					options.set('friend_activity_last_update',0,false);
					if (DEBUG) { debuginfo=""; }
					options.save();
					setTimeout(loadContent,500);
				}
				
				// Only insert if it doesn't already exist!
				if ($('better_fb_friends_pagelet')==null) {
				
					insertAtPosition( feed_right_column, createSidebarSection({ title:'Friends Activity',content:'Loading...',id:'better_fb_friends_pagelet',links:[ {linktext:'Clear',linkonclick:clear },{linktext:'Refresh',linkonclick:loadContent} ] } ), 3 );
					// check to see if we need to load new content
					var interval = options.get('friend_activity_interval');
					var last = options.get('friend_activity_last_update');
					if (DEBUG) { debuginfo += debugmsg("Last update "+Math.ceil((time()-last)/60000)+" minutes ago"); }
					if (last==null || (time()-last > (interval*60*60*1000))) {
						loadContent();
					}
					else {
						// Just show previous content!
						var c = options.get('friend_activity_content');
						if (DEBUG) { debuginfo += debugmsg('Showing cached content'); }
						html( $('better_fb_friends_pagelet'), ((DEBUG)?debuginfo:"")+c );
					}
				}
			}
		} catch(e) { showerror("Friend Activity Error",e.toString()); }
	})();
});

// LEFT COLUMN CONTENT
// ===================
// This content is dependent on the "type-ahead" content being loaded, so do that right away
function attachLeftColumnContent() {
	trace("attachLeftColumnContent()");
	var connections, connection_templates;
	
	var createNavSection = function(nav,id,title,type,allowedit,sortprop,processfunc,imgclass) {
		if ($('bf_nav_'+id)==null) {
			var open = options.get(id+'_default_open');
			var position = +options.get(id+'_position') || 0;
			var max_height = options.get(id+'_max_height') || 5000;
			var h4 = el('h4',null,null,null,title);
			h4.id = "bf_nav_title_"+id;
			bind(h4,'click',function() { toggle('bf_nav_content_'+id,id+'_default_open'); });
			h4.style.cursor = "pointer";
			var d = el('div','clearfix uiHeader uiHeaderNav uiHeaderTopBorder',{innerHTML: _template('<div id="bf_nav_%1%" class="lfloat"></div><div class="rfloat" id="bf_nav_rfloat_%1%"></div><ul class="uiSideNav bf_uiSideNav" id="bf_nav_content_%1%" style="max-height:%4%px;overflow-y:auto;overflow-x:hidden !important;%3%"></ul>',id,title,(open?"":"display:none;"),max_height ) });
			append(d.firstChild,h4);
			insertAtPosition(nav,d,position);
			if (allowedit) {
				var rfloat = $('bf_nav_rfloat_'+id);
				if (rfloat) {
					var a_id = 'bf_nav_edit_'+id;
					var a = el('a',null,{id:a_id,innerHTML:'edit'},{click:function(e){editNavSection(e,id,type,sortprop,processfunc,imgclass);}});
					append(rfloat,a);
				}
			}
			return $('bf_nav_content_'+id);
		}
	};
	
	var getConnectionsByType = function(type,sorted,sortprop) {
		var list = [];
		sortprop = sortprop || "t";
		for (var i=0; i<connections.length; i++) {
			var c = connections[i];
			if (c && c.ty && c.ty==type) { list.push(c); }
		}
		if (sorted) {
			list = list.sort( function(a,b) { if (a&&a[sortprop]&&a[sortprop].toLowerCase){a=a[sortprop].toLowerCase();} if (b&&b[sortprop]&&b[sortprop].toLowerCase){b=b[sortprop].toLowerCase();} return (a>b)?1:-1; } );
		}
		return list;
	};
	
	var imgClassCache = {};
	var createNavLink = function(title,url,imgsrc,imgclass,target) {
		var img='', hasimg=false;
		if (imgclass) {
			if (typeof imgClassCache[imgclass]!="undefined") {
				imgclass = imgClassCache[imgclass];
			}
			else if (document.querySelectorAll) {
				// imgclass will now be the id of an element ont he page whose icon we will steal by matching class names
				var i = document.querySelectorAll('#'+imgclass+' span.imgWrap i');
				if (i && i.length) {
					imgClassCache[imgclass] = i[0].className;
					imgclass = i[0].className;
				}
			}
			img = '<span class="imgWrap"><i class="'+imgclass+'"></i></span>';
			hasimg = true;
		}
		else if (imgsrc) {
			img = '<span class="imgWrap"><img src="'+imgsrc+'" height=16 width=16></span>';
			hasimg = true;
		}
		return _template('<a class="item %5%" href="%2%" target="%4%">%1%<span>%3%</span></a>',img,url,title,target,hasimg?"":"noimg" );
	};
	
	var createNavListItem = function(title,url,imgsrc,imgclass,target) {
		return "<li>"+createNavLink(title,url,imgsrc,imgclass,target)+"</li>";
	};
	
	var createConnectionSection = function(nav,type,id,title,allowedit,sortprop,processfunc,imgclass) {
		trace("Creating "+title);
		var target = options.get(id+'_new_window')?"_blank":"";
		var template = connection_templates[type].default_url;
		var content = createNavSection(nav,id,title,type,allowedit,sortprop,processfunc,imgclass);
		if (content) {
			var count = populateConnectionSection(content,id,type,sortprop,processfunc,imgclass);
			var h4 = $('bf_nav_title_'+id);
			if (h4) { h4.innerHTML += ' <span id="bf_nav_count_'+id+'" class="countValue">('+count+')</span>'; }
		}
	};
	
	var populateConnectionSection = function(container,id,type,sortprop,processfunc,imgclass) {
		var h = "";
		var target = options.get(id+'_new_window')?"_blank":"";
		var template = connection_templates[type].default_url;
		var items = getConnectionsByType(type,true,sortprop);
		var hidden_connections = options.get('hidden_connections') || {};
		var count = 0;
		if (processfunc) {
			ret = processfunc(items);
			h += ret.html;
			count = ret.count;
		}
		else {
			for (var j=0; j<items.length; j++) {
				var item = items[j], url = template.replace(/%#?/,item.i);
				if (!hidden_connections || !hidden_connections[type] || !hidden_connections[type][item.i]) {
					if (item.t) {
						count++;
						h += createNavListItem(item.t,url,item.it,imgclass,target);
					}
				}
			}
		}
		html( container, h );
		return count;
	};
	
	var editNavSection = function(e,id,type,sortprop,processfunc,imgclass) {
		var edit_link = $('bf_nav_edit_'+id);
		var content = $('bf_nav_content_'+id);
		var hidden_connections = options.get('hidden_connections') || {};
		if (typeof hidden_connections[type]=="undefined") {
			hidden_connections[type] = {};
		}
		
		if (edit_link.innerHTML == 'edit') {
			html( edit_link, 'save' );
			edit_link.style.backgroundColor = 'yellow';
			
			html( content, "" );
			var items = getConnectionsByType(type,true,sortprop);
			for (var j=0; j<items.length; j++) {
				var item = items[j];
				if (item.t) {
					var hidden = !!hidden_connections[type][item.i];
					var input = el('input',null,{type:'checkbox',value:item.i,'checked':!hidden},{click:function(){
						hidden_connections[type][this.value] = !this.checked;
						options.set('hidden_connections',hidden_connections);
					}});
					var div = el('div',null,{innerHTML:item.t});
					insertFirst(div,input);
					append(content,div);
				}
			}
		}
		else if (edit_link.innerHTML == 'save') {
			html( edit_link, 'edit' );
			edit_link.style.backgroundColor = '';
			options.save();
			var count = populateConnectionSection(content,id,type,sortprop,processfunc,imgclass);
			var count_span = $('bf_nav_count_'+id);
			if (count_span) {
				html( count_span, "("+count+")" );
			}
		}
		
	};

	// Only insert left nav sections on the home screen
	if (!QS(document,'body.home')) { return; }
	
	// Insert some new navigation links
	onIdLoad('leftCol',function(nav) {
		trace("Inserting side navigation items");
		try {
			var container = nav.getElementsByClassName('uiSideNav');
			if (container && container.length) {
				container = container[0];
				if (options.get('show_nav_all_connections')) {
					append(container, el('li',null,null,null,createNavLink('All Connections','/friends/?filter=ac',null,'navItem_ff','')) );
				}
				if (options.get('show_nav_edit_friends')) {
					append(container, el('li',null,null,null,createNavLink('Edit Friends','/friends/?filter=afp',null,'navItem_ff','')) );
				}
				if (options.get('show_nav_write_a_note')) {
					append(container, el('li',null,null,null,createNavLink('Write A Note','/editnote.php?new',null,'navItem_2347471856','_blank')) );
				}
				if (options.get('show_nav_pages_i_admin')) {
					append(container, el('li',null,null,null,createNavLink('Pages I Admin','/pages/manage/',null,'navItem_app_2309869772','')) );
				}
				if (options.get('show_nav_unblock_applications')) {
					append(container, el('li',null,null,null,createNavLink('Unblock Applications','/settings/?tab=privacy&section=applications&field=blocked_apps',null,'navItem_apps','')) );
				}
			}
		}
		catch (e) { showexception(e); }
	});

	get_remote_content('typeahead',function(response) {
		try {
			if (response) {
				var json = parse(response.substring(9),"Typeahead content");
				if (json.payload) {
					connections = json.payload.entries;
					connection_templates = json.payload.templates;
				}
				else { 
					trace("Payload not found in connections!"); 
					connections = null;
					return false;
				}
				if (connections) {
					if (connections.length==0) {
						trace("ERROR: 3rd Party cookies probably not allowed!");
					}
					trace("Making sure left column exists before continuing...");
					onIdLoad('leftCol',function(nav) {
						trace("leftCol loaded");
						// The new left nav sections need to be inserted in the ascending order of their positions
						var sections = [];
						if (options.get('show_my_pages')) { sections[+options.get('my_pages_position')||99] = function() { createConnectionSection(nav,'p','my_pages','My Pages',true); }; }
						if (options.get('show_my_events')) { sections[+options.get('my_events_position')||99] = function() { createConnectionSection(nav,'e','my_events','My Events',true,null,null,'navItem_events'); };}
						if (options.get('show_my_groups')) { sections[+options.get('my_groups_position')||99] = function() { createConnectionSection(nav,'g','my_groups','My Groups',true,null,null,'navItem_2361831622'); };}
						if (options.get('show_my_apps')) { sections[+options.get('my_apps_position')||99] = function() { createConnectionSection(nav,'a','my_apps','My Apps',true,null,null,'navItem_apps'); };}
						if (options.get('show_friends_by_network')) {
							sections[+options.get('friends_by_network_position')||99] = function() { 
								createConnectionSection(nav,'u','friends_by_network','Friends By Network',false,'n',function(items) {
									// Go through each friend to extract networks
									var html = "", networks={}, network_list=[];
									for (var i=0; i<items.length; i++) {
										var f = items[i];
										if (f.n) {
											if (typeof networks[f.n]=="undefined") {
												networks[f.n] = [];
												network_list.push(f.n);
											}
											networks[f.n].push(f);
										}
									}
									if (options.get('friends_by_network_order_by_count')) {
										network_list = network_list.sort( function(a,b) { return (networks[a].length < networks[b].length)?1:-1; } );
									}
									var count = 0;
									for (var j=0; j<network_list.length; j++) { 
										var n = network_list[j];
										var nw = networks[n];
										count++;
										html += '<li class="item bf_network" onclick="var x=this.getElementsByTagName(\'div\')[0].style;x.display=(x.display==\'none\')?\'\':\'none\';">'+n+' ('+nw.length+')<div class="bf_network_users" style="display:none;">';
										var list = nw.sort( function(a,b) { 
											var aa = (a&&a.t&&a.t.toLowerCase)?a.t.toLowerCase:"";
											var bb = (b&&b.t&&b.t.toLowerCase)?b.t.toLowerCase:"";
											return (aa>bb)?1:-1; 
										} );
										for (var i=0; i<list.length; i++) {
											var u = list[i];
											var url = connection_templates['u'].default_url.replace(/%#?/,u.i);
											html += '<a href="'+url+'">'+u.t+'</a><br>';
										}
										html += '</div></li>';
									}
									return {'html':html,'count':count};
								});
							};
						}
						// Now run through the array of functions created to run them in order
						for (var i=0; i<sections.length; i++) {
							if (sections[i]) { sections[i](); }
						}
					});
				}
			}
		} catch (e) { showexception(e); }
	});
}
try { attachLeftColumnContent(); } catch(e) { showexception(e); }
/*UPDATECHECK*/
// For update checking
function checkForUpdate(ca) {
	if (options.get('check_for_updates')) {
		trace("Check for updates?");
		var t = time();
		var hrs_since_last_check = (t-options.get('last_update_check'))/ (1000*60*60);
		trace("Hours since last check="+hrs_since_last_check);
		if (hrs_since_last_check > options.get('update_check_interval')) {
			trace("Update check required!");
			var check_version = version;
			if (options.get('version_ack') > version) {
				check_version = options.get('version_ack');
			}
			var checkUpdateInfo = function(vinfo) {

				if (vinfo && vinfo.version && vinfo.version>check_version) { 
					var scriptupdated = function() {
						options.load();
						options.set('last_update_check',t,false);
						options.set('version_ack',vinfo.version,false);
						options.save();
					}
					var features = "";
					if (vinfo.version_info && vinfo.version_info) {
						for (var ver in vinfo.version_info) {
							if (ver>check_version) {
								var f = vinfo.version_info[ver];
								if (f && f.features) {
									features += "<b>Version "+ver+"</b>:<ol>";
									for (var i=0; i<f.features.length; i++) {
										features += "<li>"+f.features[i];
									}
									features += "</ol>";
								}
							}
						}
					}
					var url = "http://BetterFacebook.net";
					var a = el('a',null,{id:'install_button',href:url,target:'_blank'},{click:scriptupdated},'Install');
					var str = '<b>A new version of Better Facebook is available!</b><br><br>Click the Install button to go to the site and install it now, or click OK to hide this message and <u><i>not</i></u> update.<br><br>';
					if (features) {
						str += 'The following features are new:<br>'+features;
					}
					str += page_message;
					var span = el('span',null,null,null,str);
					var div = el('div');
					append(div,a);
					append(div,span);
					var msg = message("",scriptupdated,div);
					insertFirst(ca, msg);
				}
				else {
					// No new version, store the last checked time only
					options.set('last_update_check',t);
				}
			}
			if (is_chrome) { 
				GM_getScript('http://BetterFacebook.net/version.php?v='+version);
				options.set('last_update_check',t);
				
			}
			else {
				get_remote_content('version_info',function(res) {
					if (res) { checkUpdateInfo(parse(res)); }
				}); 
			}
		}
	}
	return 0;
}
/*/UPDATECHECK*/

// Display a message if the user has upgraded to the latest version
if (options.get('show_version_changes')) {
	var installed_version = options.get("version");
	if (installed_version==0) {
		// First install, don't show updates
		options.set('version',version); 
	}
	else if (installed_version<version) {
		var str = '';
		if (installed_version<4.500) {
			str += 'Version '+version+':';
			str += ''+
'			<ol>'+
'				<li>Added link to RECENT ACTIVITY sections to remove all activity when clicked'+
'				<li>Improved detection of internal navigation'+
'				<li>Fixed: Filters with just "stop processing rules" action won\'t save'+
'				<li>Fixed: Auto-expand messages in left col doesn\'t work with new message system.'+
'				<li>Fixed: Pinned Notifications stopped working after Facebook change'+
'				<li>Fixed: Multiple things after Facebook changed its Profile layout'+
'					<ul>'+
'						<li>Status character counter in new publisher bar'+
'						<li>Don\'t show left nav panels on profiles/pages'+
'						<li>Don\'t show right panel pagelets on profiles/pages'+
'						<li>"Process posts on Profiles" now works'+
'						<li>Home tab on profiles didn\'t work correctly'+
'						<li>Position of Facebook\'s "close" X to match the position of BFB\'s post icons'+
'					</ul>'+
'				<li>Fixed: The "+" icon to add an app to the known list stopped working because Facebook doesn\'t show the app\'s name anymore. Now the user will be prompted for the name.'+
'				<li>Fixed: Help message stopped showing up when posting to the BFB Page.'+
'			</ol>'+
'			'+'';
		}
		if (str) {
			str = '<b style="font-size:120%;">Better Facebook has been updated! Here are the new features:</b><br><br>'+str;
			str += page_message + "<br>Click OK to dismiss this message (it should not reappear)";
			show_dialog(str,null,function(){ options.set('version',version); } );
		}
	}
}

function better_fb_options(tab_id) {
	options.displayOptions(tab_id);
}

// Fix the "Home" links so they go to /
if (options.get('fix_logo2')) { 
	document.addEventListener('click', function(e){ 
		var t = e.target; 
		if ( (t.parentNode && "pageLogo"==t.parentNode.id) || (t.accessKey=="1") || (t.parentNode && t.parentNode.parentNode && "navItem_nf"==t.parentNode.parentNode.id) ) { 
			if (typeof e.button=="undefined" || e.button==0) {
				e.stopPropagation(); e.preventDefault(); 
				window.location.href=options.get('home_url'); 
			}
		} 
	}, true);
}

// Auto-expand Apps
if (options.get('expand_nav_apps')) {
	bind(window,'load',function() {
		onIdLoad("bookmarks_menu",function(bm) {
			if (bm.querySelector) {
				setTimeout( function(){clickLink(bm.querySelector(".navMoreLess .navMoreText"));}, 1000);
			}
		});
	});
}

// Show some help if on the BFB Page
if (options.get('show_page_post_message')) {
	bind(window,'load',function() {
		onSelectorLoad('textarea.mentionsTextarea',function(o) {
			if ($('bfb_page_post_message_help')==null) {
				var title = $('profile_name');
				if (title && title.innerHTML=="Better Face Book!") {
					insertAfter( el('div','bfb_page_post_message',null,null,'<div style="border-bottom:1px solid #3B5998;">View <span id="bfb_page_post_message_help">Help</span> before posting!</div><iframe src="http://BetterFacebook.net/page_post_help.php" style="width:100%;height:100px;border:none;"></iframe>'), o.parentNode.parentNode );
					bind($('bfb_page_post_message_help'),'click',function() { show_help(); });
				}
			}
		});
	});
}

// REMOVE RECENT ACTIVITY
if (options.get('remove_recent_activity')) {
	var autoClickOkCount=0;
	var recentActivityQueue = [];
	function removeRecentActivity() {
		if (recentActivityQueue.length>0) {
			autoClickOkCount++;
			clickLink(recentActivityQueue.pop());
		}
	}
	onSelectorLoad(".confirm_dialog input[name='ok']",function(ok) {
		if (autoClickOkCount>0) {
			autoClickOkCount--;
			clickLink(ok);
			removeRecentActivity();
		}
	});
	onSelectorLoad('.UIRecentActivity_Header, .uiStreamMinistoryGroup .header',function(o) {
		var handler = function() {
			var found=false;
			QSA(o.parentNode,"a.itemAnchor",function(cb) {
				if (cb.href.indexOf("action_key=remove_content")>0) {
					found=true;
					recentActivityQueue.push(cb);
				}
			});
			if (!found) {
				QSA(o.parentNode,'.uiCloseButton',function(cb) {
					recentActivityQueue.push(cb);
				});
			}
			removeRecentActivity();
		}
		if (QS(o.parentNode,'.uiCloseButton')) {
			append(o,el('a',null,null,{click:handler},' - remove all activity'));
		}
	},true);
}

// Show any messages
onIdLoad("contentArea",function() {
	var last_msg = options.get('last_msg') || 0;
	var days_installed = (time() - +options.get('installed_on'))/(1000*60*60*24);
	if (last_msg<1 && days_installed>5) {
		if (is_chrome) { 
			var msg = ''+
			'<p>Hi, this is a message from <a href="http://MattKruse.com" target="_blank">Matt Kruse</a>, the author of Better Facebook!</p>'+
			'<p>This browser script is <span style="color:red;font-weight:bold;">FREE</span> and will always be <span style="color:red;font-weight:bold;">FREE</span>. I work on it because I enjoy the challenge of writing software that a lot of people find useful.</p>'+
			'<p>However, I am spending an increasing number of hours writing code, answering supporting emails, <a href="http://www.facebook.com/betterfb" target="_blank">debugging problems</a> and just generally helping people use Facebook better.</p>'+
			'<p>I\'m married with two children, and all this work means time away from my wife and family! So <b>if you find Better Facebook to be useful</b>, and would like to help keep my wife happy by helping me take her out to a nice dinner, or would just like to pass me a few dollars as a thank you, I am making this <b>one-time request for donations</b> to support development.</p>'+
			'<p>You can use the form below for a quick Paypal donation, or <a href="http://BetterFacebook.net/donate.php" target="_blank">click here</a> for other options.</p>'+
			'<p><b>$<input size="5" value="10.00"></b><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9627367" target="_blank"><img border="0" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif"></a></p>'+
			'<p><i>Thank you</i>, and I hope you continue finding Better Facebook useful as I continue to add features and improve it!</p>'+
			'<p>(Click OK to dismiss this message without donating, and it will not come back)</p>'+
			'<p><i>Matt</i></p>';
			show_donate_popup(1,msg);	
			
		}
		else {
			try {
				GM_xmlhttpRequest({method:'get',headers:{'Cache-Control':'no-cache'},url:"http://betterfacebook.net/donate.msg",'onload':function(res){show_donate_popup(1,res.responseText);}});
			} catch(e) { showexception(e); }
		}
	}
});

// Change CHAT images to NAME
if (options.get('chat_images_to_names')) {
	watchDOMNodeInserted('.fbChatMessageGroup .img',function(img) {
		var name=img.title;
		if (name) {
			img.style.display='none';
			img.parentNode.style.cssFloat = 'none';
			insertAfter(el('div','bfb_chat_name',null,null,name),img);
		}
	});
	onIdLoad('chatFriendsOnline',function(container) {
		QSA(container,'.uiFacepileItem a',function(friend) {
			var name = QS(friend,'span.uiTooltipText','innerHTML');
			if (name) {
				html(friend,name);
				friend.style.display="block";
				friend.parentNode.style.cssFloat = 'none';
			}
		});
	});
}

// Import User Prefs
function import_prefs() {
	var json = $('bfb_user_prefs');
	if (json) { json = json.value; }
	if (json) {
		try {
			var prefs = JSON.parse(json);
			options.prefs = prefs;
			options.save();
		}
		catch(e) {
			alert("There was an error importing your preferences:\n"+e.toString());
			alert("To make sure that your prefs are in valid JSON format, visit JSONLint.com");
		}
	}
	else {
		alert("Couldn't find input with import text!");
	}
}

// ==================================================================
// "Reusable" Options interface
// ==================================================================
function GM_options(key,userid) {
	try {
		this.optionsDiv = null;
		this.options = [];
		this.optionsObj = {};
		this.tabs = [];
		this.currentTab = null;
		this.key = key;
		this.userid = userid || "anonymous";
		
		this.prefs = {};
		
		this.load = function() {
			var storedPrefs = getValue(this.userid+'/prefs',null);
			var prefsExist = false;
			if (storedPrefs && storedPrefs!=null && storedPrefs!='' && storedPrefs!="null") {
				try {
					this.prefs = JSON.parse(storedPrefs);
					prefsExist = true;
				}
				catch (e) {
					this.prefs = {};
					showerror("Your stored preferences could not be read because they have become corrupt. Sorry, but your options been reset! This shouldn't happen again! The error was:",e.toString());
					setValue(this.userid+"/prefs","");
				}
			}
		}
		this.load();
		
		this.get = this.set = function(name,val,savenow) {
			var undef;
			var isGet = arguments.length==1;
			if (!isGet && (typeof savenow=="undefined" || savenow)) {
				this.load();
			}
			var parts = name.split(".");
			var prop = parts[parts.length-1];
			var o = this.prefs;
			var option = this.optionsObj[name];
			var def = option?option['default']:undef;

			for (var i=0; i<parts.length-1; i++) {
				var part = parts[i];
				if (typeof o[part]=="undefined") {
					if (isGet) { 
						return def; 
					}
					o[part] = {};
				}
				o = o[part];
			}
			if (!isGet) {
				if (typeof savenow=="undefined" || savenow) {
					o[prop]=val;
					this.save();
				}
				else {
					o[prop] = val;
				}
				return val;
			}

			if (typeof o[prop]!="undefined") {
				return o[prop];
			}
			return def;
		}

		this.save = function() {
			var json = JSON.stringify(this.prefs);
			setValue(this.userid+"/prefs",json);
		};
		
		this.addSectionHeader = function(title) {this.addHtml("<h2>"+title+"</h2>");};
		this.addOption = function(name,type,def,opt) {opt = opt || {};opt.name = name;opt.type = type;opt['default'] = def;this.options.push( opt );this.optionsObj[opt.name] = opt;};
		this.addHtml = function(html) {this.options.push( {'type':'html', 'value':html } );};
		this.addFunction = function(func) {this.options.push( {'type':'function', 'value':func } );}
		this.renderOption = function(opt) {
			opt.value = this.get(opt.name);
			opt.onchange = opt.onchange || "";
			var input = '';
			// CHECKBOX Option
			if (opt.type=="checkbox") {
				opt.checked = (opt.value?"checked":"");
				input = _template('<input type="checkbox" name="%name%" onclick="%onchange%" %checked%>', opt);
			}
			// TEXTAREA option
			else if (opt.type=='textarea') {
				input = _template('<textarea name="%name%" nowrap class="textarea" style="width:90%;" onchange="%onchange%" rows="%rows%" cols="%cols%">%value%</textarea>', opt);
			}
			// INPUT option
			else {
				input = _template('<input name="%name%" class="text" onchange="%onchange%" value="%value%" size="%size%">', opt);
			}
			return input;
		};
		this.render = function(tab_id) {
			var self = this;
			var alt = 0;
			var content = ''+
'				<div class="bf_tabs" id="bf_tabs">'+
'					<div class="bf_tab" id="bf_t_popular">Popular</div>'+
'					<div class="bf_tab" id="bf_t_display">Display</div>'+
'					<div class="bf_tab" id="bf_t_filter">Feed Filter</div>'+
'					<div class="bf_tab" id="bf_t_left">Left Panel</div>'+
'					<div class="bf_tab" id="bf_t_right">Right Panel</div>'+
'					<div class="bf_tab" id="bf_t_advanced">Advanced</div>'+
'					<div class="bf_tab" id="bf_t_css">CSS</div>'+
'					<div class="bf_tab" id="bf_t_debug">Debug</div>'+
'					<div class="bf_tab" id="bf_t_prefs">User Prefs</div>'+
'					<div class="bf_tab" id="bf_t_privacy">Privacy</div>'+
'					<div class="bf_tab" id="bf_t_about">About</div>'+
'				</div>'+
'				<div id="bf_options_body">'+
'					<div class="bf_option_body" id="bf_t_popular_body" style="display:block;vertical-align:bottom;">'+
'						<div>%display_control_panel% Display the "<b>Control Panel</b>" at the top of feed</div>'+
'						<div>In the control panel, show: %cp_button_mark_all_read% Mark All Read '+
'															%cp_button_show_hide_all% Show/Hide All '+
'															%cp_button_mute_all% Mute All '+
'															%cp_button_reload% Reload '+
'															%cp_button_help% Help '+
'						</div>'+
'						<div>%show_post_actions% Show <b>Post Action Icons</b> on each post. %hide_post_actions_until_hover% Hide until hover / Opacity=%post_action_opacity2% / Zoom=%post_action_zoom%%</div>'+
'						<div>%expand_similar_posts% Automatically <b>expand "SHOW X SIMILAR POSTS"</b> links with a delay of %expand_similar_posts_delay%ms between clicks</div>'+
'						<div><b>Pin the notifications</b> panel to the %pin_notifications_right_panel% right sidebar or the %pin_notifications% far right( and force it to be %pin_notifications_width% wide (ex:200px) )</div>'+
'						<div>Automatically click "<b>Older Posts</b>" link on the home page %auto_click_more_times% times to get more posts</div>'+
'						<div><b>Freeze</b> the %static_header% <b>Header Bar</b> and/or %static_left_col% <b>Left Column</b></div>'+
'						<div>%show_notification_previews% Show previews when hovering over notification list items</div>'+
'						<div>%float_control_panel% Float the control panel down the page as you scroll with an opacity of %floating_cp_opacity% and an offset of %floating_cp_offset%px</div>'+
'						<div>%fix_logo2% Fix navigation on the upper left logo and "News Feed" links to go to %home_url%</div>'+
'						<div>%chat_images_to_names% Change profile images in Chat to names</div>'+
'						<div>Force post font size to be %post_font_size%px</div>'+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_display_body" style="vertical-align:bottom;">'+
'						<div>%tab_count% Show post count in tab.</div>'+
'						<div>%reorder% Put posts in proper chronological order after expanding (may cause some browser slowdown!)</div>'+
'						<div>%process_profiles% Process posts on Profiles and Pages, add control, and allow Mark As Read</div>'+
'						<div>%process_recent_activity% Process "Recent Activity" posts</div>'+
'<!--						<div>%stretch_wide% Stretch the Facebook layout to fill the browser\'s width</div>-->'+
'						<div>%auto_expand_comments% Auto-expand comment threads on posts by Pages</div>'+
'						<div>%expand_see_more% Auto-expand "see more" links in posts to show the full post</div>'+
'						<div>%hide_status_updater% Hide my <b>name and picture</b> in the upper left</div>'+
'						<div>%hide_options_icon% Hide the <b>icon</b> next to the Better Facebook "Options" button</div>'+
'						<div>%left_align% <b>Left align</b> the content column rather than center</div>'+
'						<div>%force_most_recent_feed% Force the main news feed to be "<b>Most Recent</b>" instead of "Top News"</div>'+
'						<div>%alternate_read_display% Show old stories as <b>grayed out</b> rather than hiding them completely</div>'+
'						<div>%reload_when_mark_all_read% <b>Reload automatically</b> when Mark All Read is clicked</div>'+
'						<div><b>Hide new comment notifications</b> (%auto_mute_all% always) or when there are more than %auto_mute_count% comments</div>'+
'						<div>%hide_when_muted% Hide a post immediately when it is <b>muted</b></div>'+
'						<div>%hide_old_comments% <b>Hide old comments</b> when alerting of "X new comments" to a post</div>'+
'						<div>%hide_update_email% Hide the "<b>Please update your email address</b>" box that appears repeatedly</div>'+
'						<div>%show_char_counter% Add a character counter in status update boxes</div>'+
'						<div>%hide_notification_pictures% Hide profile pictures in the notification list</div>'+
'						<div>%hide_hovercard% Hide info popup when hovering over user name links</div>'+
'						<div>%remove_recent_activity% Add a "remove all activity" link to RECENT ACTIVITY blocks</div>'+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_advanced_body" style="vertical-align:bottom;">'+
'						<div>Notification preview Image max-width:%preview_img_max_width2% max-height:%preview_img_max_height2%</div>'+
'						<div>%show_options_save_message% Show "Refresh the page" alert after saving Options</div>'+
'						<div>Clean out data for individual posts after %comment_expire_days% days (per post) to save space in preferences</div>'+
'						<div>%highlight_suggest_to_friends% Highlight the "Suggest To Friends" link on the Better Facebook Page</div>'+
'						<div>%show_version_changes% Show changes after installing a new version</div>'+
'<!-- /*UPDATECHECK*/-->'+
'						<div>%check_for_updates% Check for script updates every %update_check_interval% hours</div>'+
'<!-- /*/UPDATECHECK*/-->'+
'						<div>When clicking a link in an application post, %open_app_link_in_tab% open in a new browser tab/window and %open_app_link_marks_read% automatically mark the story as read</div>'+
'						<div>%mark_read_on_comment% Automatically mark a post as "read" after commenting on it</div>'+
'						<div>%show_page_post_message% Show the Help message for new posts to the Better Facebook Page</div>'+
'						<div>%allow_bfb_formatting% Allow posts by Better Facebook to retain html formatting</div>'+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_left_body">'+
''+
'					<div><b>Add links</b> to navigation: %show_nav_all_connections% All Connections %show_nav_edit_friends% Edit Friends %show_nav_write_a_note% Write A Note %show_nav_pages_i_admin% Pages I Admin %show_nav_unblock_applications% Unblock Applications</div>'+
'					<div>%hide_chat_panel% Hide "Friends on Chat" panel</div>'+
'					<div>%show_friends_on_chat_when_offline% Show friends on chat even when offline</div>'+
'					<div><b>Auto-expand</b>:'+
'						<div class="bf_sub_option">%expand_nav_messages% Messages</div>'+
'						<div class="bf_sub_option">%expand_nav_events% Events</div>'+
'						<div class="bf_sub_option">%expand_nav_photos% Photos</div>'+
'						<div class="bf_sub_option">%expand_nav_friends% Friends'+
'							<div>%expand_nav_friends_full% Show all friend groups (no "more" link)</div>'+
'						</div>'+
'						<div class="bf_sub_option">%expand_nav_apps% Apps</div>'+
'					</div>'+
'						<div>%show_my_pages% Show "<b>My Pages</b>" | %my_pages_new_window% In a new window | %my_pages_default_open% Default Open | %my_pages_max_height%px high in position %my_pages_position%</div> '+
'						<div>%show_my_events% Show "<b>My Events</b>" | %my_events_new_window% In a new window | %my_events_default_open% Default Open | %my_events_max_height%px high in position %my_events_position%</div> '+
'						<div>%show_my_groups% Show "<b>My Groups</b>" | %my_groups_new_window% In a new window | %my_groups_default_open% Default Open | %my_groups_max_height%px high in position %my_groups_position%</div> '+
'						<div>%show_my_apps% Show "<b>My Apps</b>" | %my_apps_new_window% In a new window | %my_apps_default_open% Default Open | %my_apps_max_height%px high in position %my_apps_position%</div> '+
'						<div>%show_friends_by_network% Show "<b>Friends By Network</b>" | %friends_by_network_new_window% In a new window | %friends_by_network_default_open% Default Open | %friends_by_network_max_height%px high in position %friends_by_network_position%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%friends_by_network_order_by_count%Put networks with the most friends first</div> '+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_right_body">'+
'						<div>%pagelet_toggle% Enable collapse/expand of boxes in right panel by clicking their headers</div>'+
'						<div>%hide_connect_box% Hide the "<b>Connect With Friends</b>" box</div>'+
'						<div>%hide_suggestions_box% Hide the "<b>Suggestions</b>" box</div>'+
'						<div>%hide_events_box% Hide the "<b>Events</b>" box</div>'+
'						<div>%hide_beta_box% Hide the "<b>Beta Tester</b>" box</div>'+
'						<div>%hide_recommended_pages_box% Hide the "<b>Recommended Pages</b>" box</div>'+
'						<div>%hide_pokes% Hide the "<b>Pokes</b>" box</div>'+
'						<div>%hide_questions% Hide the "<b>Questions</b>" box</div>'+
'						<div>%hide_get_connected% Hide the "<b>Get Connected</b>" box</div>'+
'						<div>%show_friend_tracker% Show <b>Friend Tracker</b>'+
'							<div>Check every %friend_tracker_interval% hours and show for %friend_tracker_duration% days</div>'+
'						</div>'+
'<!--'+
'						<div>%show_group_activity% Show <b>Group Activity</b>'+
'							<div>Check every %group_activity_interval% hours</div>'+
'						</div>'+
'-->'+
'						<div>%show_friend_activity% Show <b>Friend Activity</b>'+
'							<div>Check every %friend_activity_interval% hours</div>'+
'							<div>%friend_activity_show_pics% Show small profile pictures</div>'+
'							<div>Hide activity if it matches pattern: %friend_activity_hide_text%</div>'+
'						</div>'+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_filter_body">'+
'						<div>%filters_enabled% Enable Filters</div>'+
'						<div>%always_show_tabs% Always show all defined tabs (even if no posts are moved there)</div>'+
'						<div>%filter_profiles% Filter posts on pages and profiles</div>'+
'						<div>%tab_all_apps% Automatically move known App (those in list below) posts to their own tab</div>'+
'						<div>Custom App list: (format:  app_id:app_name,app_id:app_name&nbsp;&nbsp;&nbsp;&nbsp;ex: 12345:MyFarm)<br>%custom_apps%</div>'+
'						<div>'+
'							<table class="bfb_filter_list" border=1 width=100%>'+
'							<thead>'+
'								<tr>'+
'									<th>Author</th>'+
'									<th>Type</th>'+
'									<th>Application</th>'+
'									<th>Other</th>'+
'									<th>Action</th>'+
'									<th>&nbsp;</th>'+
'								</tr>'+
'							</thead>'+
'							<tbody id="bfb_filter_list"></tbody>'+
'							<tfoot id="bfb_filter_list_tfoot"></tfoot>'+
'							</table>'+
'						</div>'+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_css_body">'+
'						<div>Insert a reference to an external stylesheet:<br>%css_url%</div> '+
'						<div>Custom post action "sprite" url: %sprite_url%</div>'+
'						<div>Add any arbitrary CSS rules to insert into the page:<br>%css%</div> '+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_prefs_body">'+
'						<div>All of your stored preferences, story "read" statuses, comment counts, etc are stored in the JSON format below. This can be useful for backing up your preferences. You may also copy preferences into the box and import.</div> '+
'						<div><textarea id="bfb_user_prefs"></textarea></div> '+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_debug_body">'+
'						<div>If things aren\'t working right, this is where we\'ll fix it!</div>'+
'						<div>%debug% Enable Debug Mode</div>'+
'						<div>%performance_monitor% Enable Performance Monitoring</div>'+
'						<div>%show_errors% Show errors</div>'+
'						<div>%show_conflicts% Show potential script conflicts</div>'+
'						<div>Test setting/getting preferences: <input type="button" id="bfb_debug_test_set" value="Set Pref"> <input type="button" id="bfb_debug_test_get" value="Get Pref"></div>'+
'						<div>Trace Log: <i>(Copy the contents of this box along with bug reports, please!)</i></div>'+
'						<div id="bf_tracelog">%tracelog%</div>'+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_privacy_body">'+
'						<div style="padding:50px;"><img src="http://www.reclaimprivacy.org/images/logo.png" style="margin:30px;float:left;"><a href="http://reclaimprivacy.org">ReclaimPrivacy.org</a> is a popular tool used to scan your privacy settings for potential leaks of your information to users other than your friends. <button onclick="var script=document.createElement(\'script\');script.src=\'http://static.reclaimprivacy.org/javascripts/privacyscanner.js\';document.getElementsByTagName(\'head\')[0].appendChild(script);">Scan Now</button></div> '+
'					</div>'+
'					<div class="bf_option_body" id="bf_t_about_body">'+
'						<div style="font-size:16px !important;">'+
'							<img src="http://betterfacebook.net/matt.jpg" style="float:left;margin:10px;border:1px solid black;">'+
'							My name is <a href="http://MattKruse.com">Matt Kruse</a>, and Better Facebook is a personal project of mine. I started working on it in 2009 as a <a href="http://userscripts.org/scripts/show/61761">Greasemonkey script for Firefox</a>, because I was annoyed that I couldn\'t get rid of posts that I\'ve already read and only see the new stuff.'+
'							<br><br>'+
'							From there it grew as I added more options and functionality, and released it for public use. I got a lot of feedback and more ideas, and kept building. As I learned about user script and extension support in Chrome, Safari, and Opera, I added support for those browsers also.'+
'							<br><br>'+
'							In July of 2010, Apple featured the Better Facebook extension in its <a href="http://extensions.apple.com/">Safari Extension Gallery</a> and the number of users doubled in under two weeks! Since then it has enjoyed sustained growth which I think is pretty cool.'+
'							<br><br>'+
'							Personally, I am married to my wife Dawn and we have had three children - Emily (10), Ava (1), and Kevin, who is no longer with us. We have 3 dogs, 4 cats, and 7 chickens which forms what we like to call <a href="http://www.Krusezoo.com">The Kruse Zoo</a>!'+
'							<br><br>'+
'							I\'ve created this application in my (limited) free time and I make it free to the Facebook user community. However, I also accept donations to help offset the development time, server expense, etc. Though I certainly don\'t expect everyone to donate, I\'m very appreciative of those that do.<br><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9627367" target="_blank"><img border="0" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif"></a>'+
'							<br><br>'+
'							I hope you enjoy Better Facebook, and I love to hear feedback on the <a href="http://Facebook.com/betterfb/">Better Facebook Page</a>!'+
'						</div> '+
'					</div>'+
'				</div>'+
'			'+'';
			content = content.replace("%tracelog%",tracelog);
			// Replace the options place-holders with the actual options
			this.options.forEach(function(opt,i) {
				if (opt.name) {
					content = content.replace( new RegExp("%"+opt.name+"%","g"), self.renderOption(opt));
				}
			});
			return content;
		};

		// When the Feed Filters tab is loaded, get the typeahead content so we can generate the filters list with the typeahead content
		onIdLoad('bfb_filter_list',function(tbody) {
			trace("bfb_filter_list loaded");
			if (options.get('feed_filter_show_help')) {
				var div = tbody.parentNode.parentNode;
				insertFirst( div, message('<b>Feed Filters</b> allow you to control which posts you see and how they are displayed. This powerful interface gives you full control.<br><br>When a post is displayed, it will first be checked against each filter rule below. If it matches the selections for Author, Type, Application, and Other, then the Action will be taken. You can find <b>full documentation</b> of how to use the Feed Filter <b><a href="http://BetterFacebook.net/#ff" target="_blank">on the Better Facebook web site</a></b>.<br><br><b>NOTE!</b> Using filters may slow down Facebook while posts are being processed. Using many filters may cause increased slowdown on slower computers.', function() { options.set('feed_filter_show_help',false); }) );
			}
			get_remote_content('typeahead',function(response) {
				trace("typeahead content loaded for filters");
				var renderOption = function(v,t,sel) {
					return '<option value="'+v+'"'+(sel?' selected':'')+'>'+t+'</option>';
				};
				var renderFilter = function(filter,options) {
					trace("Rendering filter");
					return '<tr class="bfb_filter">'+renderFilterBody(filter,options)+'</tr>';
				};
				var renderFilterBody = function(filter,options,tr) {
					if (!filter || !filter.criteria) { filter = {criteria:{},actions:{}}; }
					var tds = [], c="";
					tds.push('<select class="nosave actrs" style="width:150px;" name="actrs" size="10" multiple>'+options+'</select>');
					
					c='<select class="nosave sty" name="sty" size="10" style="width:175px;" multiple onchange="var sel=false;for(var i=0;i<this.options.length;i++){if(this.options[i].selected){sel=true;break;}};var a=this.parentNode.parentNode.getElementsByClassName(\'app_id\')[0];a.style.display=(sel?\'none\':\'\');a.selectedIndex=-1;a=this.parentNode.parentNode.getElementsByClassName(\'app_id_custom_wrap\')[0];a.style.display=(sel?\'none\':\'\');">';
					for (var i in storyTypes) { 
						// For each story type, check to see if any of the comma-separated values are selected. If so, select the option
						var selected = false;
						var type_list = i.split(/\s*,+\s*/);
						for (var j=0; j<type_list.length; j++) {
							if (filter.criteria.sty && (type_list[j] in filter.criteria.sty)) {
								selected = true; break;
							}
						}
						c += renderOption(i,storyTypes[i],selected); }
					c+='</select>';
					tds.push(c);

					c='<select class="nosave app_id" style="width:150px;" name="app_id" size="8" multiple onchange="var sel=false;for(var i=0;i<this.options.length;i++){if(this.options[i].selected){sel=true;break;}};var a=this.parentNode.parentNode.getElementsByClassName(\'sty\')[0];a.style.display=(sel?\'none\':\'\');">';
					for (var i in apps) { c += renderOption(i,apps[i],(filter.criteria.app_id && (i in filter.criteria.app_id))); }
					// Build a list of app_id's that are not "known"
					var app_id_custom = [];
					if (filter.criteria.app_id) {
						for (var i in filter.criteria.app_id) {
							if (typeof apps[i]=="undefined") { app_id_custom.push(i); }
						}
					}
					c+='</select><div class="app_id_custom_wrap">Custom app_id(s):<br><input name="app_id_custom" class="nosave app_id_custom" value="'+app_id_custom.join(',')+'" size="15"></div>';
					tds.push(c);
					
					tds.push('Matching<br>text:<br> <input class="nosave regex" name="regex" value="'+(filter.criteria.regex?htmlescape(filter.criteria.regex):'')+'" size="6"><br>Advanced:<br>Use regular<br>expressions<br>like<br>/text|text2/<br>( | = OR )');
					tds.push(''+
					'	<input class="nosave action-hide" '+(filter.actions.hide?' checked ':'')+' type="checkbox" name="action" value="hide"> Hide<br>'+
					'	<input class="nosave action-minimize" '+(filter.actions.minimize?' checked ':'')+' name="action" value="minimize" type="checkbox"> Minimize<br>'+
					'	<input class="nosave action-addclass" '+(filter.actions.add_class?' checked ':'')+' name="action" value="add_class" type="checkbox"> Apply CSS Class: <br>'+
					'		<input class="nosave add-class" name="add_class" size="8" value="'+(filter.actions.add_class?filter.actions.add_class:'')+'" onkeyup="this.parentNode.getElementsByClassName(\'action-addclass\')[0].checked=(this.value!=\'\');"><br>'+
					'	<input class="nosave action-movetotab" '+(filter.actions.move_to_tab?' checked ':'')+' name="action" value="move_to_tab" type="checkbox"> Move to Tab: <br>'+
					'		<input class="nosave move-to-tab" name="move_to_tab" size="8" value="'+(filter.actions.move_to_tab?filter.actions.move_to_tab:'')+'" onkeyup="this.parentNode.getElementsByClassName(\'action-movetotab\')[0].checked=(this.value!=\'\');"><br>'+
					'	<input class="nosave action-stop" '+(filter.stop?' checked ':'')+' name="action" value="stop" type="checkbox"> Stop processing rules');
					tds.push('<img class="bfb_up" style="cursor:pointer;" src="'+up_img+'" onclick="tr=this.parentNode.parentNode;tr.parentNode.insertBefore(tr,tr.previousSibling);"><br><img style="cursor:pointer;" src="'+delete_img+'" onclick="if(confirm(\'Delete this filter row?\')){var tr=this.parentNode.parentNode;tr.parentNode.removeChild(tr);}"><br><img class="bfb_down" style="cursor:pointer;" src="'+down_img+'" onclick="tr=this.parentNode.parentNode;tr.parentNode.insertBefore(tr.nextSibling,tr);"></td>');
					
					// If passed in a tr, append the tds, otherwise make a string
					c = "";
					for (var i=0; i<tds.length; i++) {
						var td = tds[i];
						if (tr) { tr.appendChild( el('td',null,null,null,td) ) }
						else { c+="<td>"+td+"</td>"; }
					}
					return c;
				}

				var friends=[],pages=[];
				var list = "";
				if (response) {
					var json = parse(response.substring(9),"Typeahead content");
					if (json.payload) {
						var connections = json.payload.entries;
						if (connections) {
							connections = connections.sort( function(a,b) { return (a.t>b.t)?1:-1; } );
							for (var i=0; i<connections.length; i++) {
								var c = connections[i];
								if (c.ty=="u") { friends.push(c); }
								if (c.ty=="p") { pages.push(c); }
							}
							
							friends = friends.sort( function(a,b) { return (a.t>b.t)?1:-1; } );
							pages = pages.sort( function(a,b) { return (a.t>b.t)?1:-1; } );
							var renderAuthorOptions = function(friendlist,pagelist,filter) {
								if (!filter || !filter.criteria) { filter = {criteria:{},actions:{}}; }
								var list = '<optgroup label="Friends">';
								for (var i=0; i<friends.length; i++) {
									list += renderOption(friends[i].i,friends[i].t,(filter.criteria.actrs && (friends[i].i in filter.criteria.actrs)));
								}
								list += '</optgroup>';
								list += '<optgroup label="Pages">';
								for (var i=0; i<pages.length; i++) {
									list += renderOption(pages[i].i,pages[i].t,(filter.criteria.actrs && (pages[i].i in filter.criteria.actrs)));
								}
								list += '</optgroup>';
								return list;
							}
							
							// For each filter, render the filter. Pass in the options for authors
							var fcontent = "";
							// If there are no filters, create an empty shell
							if (filters.length==0) {
								fcontent = renderFilter(null,renderAuthorOptions(friends,pages,null));
							}
							else {
								for (var i=0; i<filters.length; i++) {
									fcontent += renderFilter(filters[i],renderAuthorOptions(friends,pages,filters[i]));
								}
							}
							
							// Populate all the content into the tbody
							tbody.innerHTML = fcontent;
						}
						else {
							showerror("No connections");
						}
					}
					else {
						showerror("No json.payload");
					}
				}
				else {
					showerror("No response!");
				}
				
				var add_filter = function() {
					var body = renderFilterBody(null,renderAuthorOptions(friends,pages,null));
					var tr = el('tr','bfb_filter');
					renderFilterBody(null,renderAuthorOptions(friends,pages,null),tr);
					tbody.appendChild( tr );
				}
				
				// Attach an "add" button to the footer
				append($('bfb_filter_list_tfoot'),button('Add Filter',add_filter,null));
			});
		});
			
		this.displayOptions = function(tab_id) {
			var doc = document;
			var optionsContent = this.render(tab_id);
			var optionsWrapper = _template( ''+
		'		<div class="GM_options_wrapper_inner">'+
		'			<form name="%key%" id="form_%key%">		\n'+
		'				<div class="GM_options_header">		\n'+
		'					<div class="GM_options_buttons">		\n'+
		'						<input type="button" name="GM_options_save" id="GM_options_save" value="Save">		\n'+
		'						<input type="button" name="GM_options_cancel" id="GM_options_cancel" value="Cancel"><br><br><a href="http://BetterFacebook.net/donate.php" target="_blank"><img border="0" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif"></a><br>to support development!	\n'+
		'					</div>		\n'+
		'					<a href="http://betterfacebook.net/"><img src="http://s3.amazonaws.com/uso_ss/icon/61761/thumb.png?1257973686" width="120" height="90" align="left" style="margin-right:20px;" border="0"></a>		\n'+
		'					<i>Version '+version+'</i><br>'+page_message+
		'				</div>		\n'+
		'				<div class="GM_options_body">		\n'+
		'						%options%		\n'+
		'				</div>		\n'+
		'				<div class="" style="text-align:center;">		\n'+
		'					<div class="GM_options_buttons" style="float:none;text-align:center;width:auto;">		\n'+
		'						<input type="button" name="GM_options_save" id="GM_options_save2" value="Save">		\n'+
		'						<input type="button" name="GM_options_cancel" id="GM_options_cancel2" value="Cancel">		\n'+
		'					</div>		\n'+
		'				</div>		\n'+
		'				<div style="float:right;"><a href="http://BetterFacebook.net/faq.php#uninstall" onclick="alert(\'Before uninstalling, please review the FAQ if you are having any problems or issues. You may find the solution there. Also, I would appreciate an email at matt@mattkruse.com letting me know why you uninstalled, so I can improve BFB in the future!\');">Uninstall</a></div><div style="clear:both;"></div> \n'+
		'			</form>		\n'+
		'		</div>', {'options':optionsContent,'key':this.key} );

			var div = this.optionsDiv;
			var self = this;
			if (div==null) {
				this.optionsDiv = doc.createElement('div');
				div = this.optionsDiv;
				div.className = 'GM_options_wrapper '+this.key+'_wrapper';
				html( div, optionsWrapper );
				doc.body.appendChild(div);
			}
			else {
				div.innerHTML = optionsWrapper;
			}
			bind('GM_options_save','click',function() { self.saveOptions(); });
			bind('GM_options_cancel','click',function() { self.cancelOptions(); });
			bind('GM_options_save2','click',function() { self.saveOptions(); });
			bind('GM_options_cancel2','click',function() { self.cancelOptions(); });
			append($('bf_t_prefs_body'), button("Export Options",function(){ var json=JSON.stringify(options.prefs,function(k,v){if(k=="story_data"){return undefined;}return v;},1); if(confirm("The text box above will now be populated with your current preferences ("+json.length+" bytes). Continue?")) { $('bfb_user_prefs').value=json;} },"bfb_prefs_export_options") );
			append($('bf_t_prefs_body'), button("Export All (including story data)",function(){ var json=JSON.stringify(options.prefs,null,1); if(confirm("The text box above will now be populated with your current preferences ("+json.length+" bytes). Continue?")) { $('bfb_user_prefs').value=json;} },"bfb_prefs_export_all") );
			append($('bf_t_prefs_body'), button("Import",function(){ if(confirm('Are you sure you want to overwrite your existing preferences and import the prefs above?')){import_prefs();self.cancelOptions();}},"bfb_prefs_import") );
			append($('bf_t_prefs_body'), button("Clean Story Data",function(){ if(confirm('This will prune old story data from your preferences. (This is also done each time you press Mark All Read)')){clean_prefs();}},"bfb_prefs_clean") );
			bind('bfb_debug_test_set','click',function() { options.set('debugtest',time()); alert("Test preference saved"); });
			bind('bfb_debug_test_get','click',function() { var v=options.get('debugtest'); if(v){ alert("Test preference set on:"+((new Date(v)).toString())); }else{alert("No saved preference found"); } });
			
			// Add an event listener for switching tabs
			var showtab = function(e) { 
				var tabs = $('bf_tabs');
				if (typeof e=="string") {
					var tabid = $(e).id;
				}
				else {
					var tabid = e.target.id
				}
				for(var i=0;i<tabs.childNodes.length;i++){
					tabs.childNodes[i].className="";
				}
				$(tabid).className="bf_tab_selected"; 
				$$('bf_option_body',"this.style.display='none';",$('bf_options_body'));
				$(tabid+"_body").style.display="block";
			}
			bind('bf_tabs','click',showtab);
			
			tab_id = tab_id || 'bf_t_popular';
			showtab(tab_id);
			div.style.display="block";
		};
		this.hideOptions = function() {
			if (this.optionsDiv!=null) {
				this.optionsDiv.style.display='none';
				this.optionsDiv.innerHTML='';
			}
		};
		this.cancelOptions = function() {
			this.hideOptions();
		};
		this.saveOptions = function() {
			this.load();
			var doc = document;
			var f = doc.getElementById('form_'+this.key);
			if (f && f.elements) {
				for (var i=0; i<f.elements.length; i++) {
					var el = f.elements[i];
					if (el.name && el.name.indexOf("GM_")!=0 && !hasClass(el,"nosave")) {
						if (el.type=="checkbox") {
							this.set(el.name,el.checked,false);
						}
						else if (el.type=='text') {
							this.set(el.name,el.value,false);
						}
						else if (el.type=='textarea') {
							this.set(el.name,el.value,false);
						}
						else if (el.type=='select-one') {
							this.set(el.name,el.options[el.selectedIndex].value,false);
						}
					}
				}
			}
			else {
				alert('Form not found!');
			}
			
			// Read in the filter rules to create filters list
			var getSelectValue = function(sel){var r=null;for (var i=0; i<sel.options.length; i++) {var o = sel.options[i];if (o.selected) {if(r==null){r={};};r[o.value]=o.text;}}return r;};
			var hasprops = function(o){for(var i in o){return true;}};

			var savefilters = [];
			var tbody = $('bfb_filter_list');
			try {
				if (tbody) {
					var trs = tbody.getElementsByTagName('TR');
					if (trs && trs.length>0) {
						for (var i=0; i<trs.length; i++) {
							var tr = trs[i];
							var filter = {criteria:{},actions:{}};
							var cr=function(name) { return tr.getElementsByClassName(name)[0]; }
							// Criteria
							var actrs = getSelectValue(cr('actrs'));
							if (actrs) { filter.criteria.actrs = actrs; }
							var sty = getSelectValue(cr('sty'));
							if (sty) {
								var styo = {};
								for (var sty_id in sty) {
									var id_list = sty_id.split(/\s*,+\s*/);
									if (id_list) {
										for (var j=0; j<id_list.length; j++) {
											styo[id_list[j]] = id_list[j];
										}
									}
								}
								filter.criteria.sty = styo; 
							}
							var app_id = getSelectValue(cr('app_id'));
							if (app_id) { filter.criteria.app_id = app_id; }
							var app_id_custom = cr('app_id_custom');
							if (app_id_custom) {
								var app_ids_custom = app_id_custom.value.split(/\s*,\s*/);
								if (app_ids_custom && app_ids_custom.length>0) {
									for (var j=0; j<app_ids_custom.length; j++) {
										if (app_ids_custom[j].length>0) {
											if (typeof filter.criteria.app_id=="undefined") {
												filter.criteria.app_id={};
											}
											filter.criteria.app_id[app_ids_custom[j]] = "Custom app_id:"+app_ids_custom[j];
										}
									}
								}
							}
							var regex = cr('regex').value;
							if (regex && regex.length>0) { filter.criteria.regex=regex; }
							// Actions
							if (cr('action-hide').checked) { filter.actions.hide=true; }
							if (cr('action-minimize').checked) { filter.actions.minimize=true; }
							if (cr('action-addclass').checked) { filter.actions.add_class=cr('add-class').value; }
							if (cr('action-movetotab').checked) { filter.actions.move_to_tab=cr('move-to-tab').value; }
							if (cr('action-stop').checked) { filter.stop=true; }
							
							if (filter.criteria && filter.criteria.sty && filter.criteria.app_id) {
								// Can't have a filter on both sty and app_id! Doesn't make sense!
								delete filter.criteria.app_id;
							}
							if (hasprops(filter.criteria) && (hasprops(filter.actions) || filter.stop)) {
								savefilters.push(filter);
							}
						}
					}
				}
				this.set('filters',savefilters,false);
				filters = savefilters;
			} catch(e) { showexception(e); }
			
			this.save(false);
			if (options.get('show_options_save_message')) {
				alert("Refresh the page to see your changes");
			}
			this.hideOptions();
		};
	}
	catch(e) { showexception(e); return null; }
}

})();

