Large

Facebook Old Chat Sidebar

By rockihack Last update Apr 17, 2013 — Installed 100,512 times.

There are 82 previous versions of this script.

// ==UserScript==
// @name			Facebook Old Chat Sidebar
// @namespace			lenni
// @description			Replaces new Facebook sidebar with one like the original.
// @version			2.2.4
// @updateURL			https://userscripts.org/scripts/source/123164.meta.js
// @grant			none
// @include			http://*.facebook.com/*
// @include			https://*.facebook.com/*
// @match			http://*.facebook.com/*
// @match			https://*.facebook.com/*
// @exclude			http://*.facebook.com/ajax/*
// @exclude			https://*.facebook.com/ajax/*
// ==/UserScript==

// Author: www.lennart-glauer.de
// Date: 17.04.2013
// License: GNU General Public License v3 (GPL)
// Url: http://userscripts.org/scripts/show/123164

if(!!window.opera){
	unsafeWindow = window;
}else if(!!window.navigator.vendor.match(/Google/)){
	var div = document.createElement('div');
	div.setAttribute('onclick','return window;');
	unsafeWindow = div.onclick();
}

(function(w){
	var d = w.document;

	var settings = {
		// open buddylist on load
		Onload:		true,

		// set buddylist sticky ( stay opened )
		Sticky:		true,

		// show online friends
		Online:		true,

		// show idle friends
		Idle:		true,

		// show mobile friends
		Mobile:		true,

		// buddylist style
		Margin:		'0px 10px',
		MinHeight:	'140px',
		Width:		'200px'
	};

	function ajax(url){
		this.Url = url;
		this.XMLHttpRequest = new w.XMLHttpRequest();
	}

	ajax.prototype = {
		'send':function(type,data,callback){
			try{
				this.Callback = callback;
				this.XMLHttpRequest.open(type,this.Url,true);
				this.XMLHttpRequest.onreadystatechange = this.stdcallback.bind(this);
				this.XMLHttpRequest.send(data);
				return true;
			}catch(e){
				return false;
			}
		},

		'stdcallback':function(){
			if(this.XMLHttpRequest.readyState === 4 && this.XMLHttpRequest.status === 200){
				if(typeof this.Callback === 'function') this.Callback(this.XMLHttpRequest);
			}
		}
	};

	var util = {
		'insertRule':function(rule){
			if(!this.css){
				this.css = d.createElement('style');
				d.querySelector('head').appendChild(this.css);
			}

			return this.css.appendChild(d.createTextNode(rule));
		}
	};

	var rocki = {
		'DOMContentLoaded':function(){
			w.toggle_list = function(r){
				if(!!w.localStorage.getItem('toggle' + r)){
					w.localStorage.removeItem('toggle' + r);
				}else{
					w.localStorage.setItem('toggle' + r,true);
				}
				w.render_chat();
			};

			w.change_order = function(r){
				var f = d.querySelectorAll('ul.fbChatOrderedList li.separator[id]');
				for(var i = 1, j = f.length; i < j; i++){
					if(f.item(i).id === r){
						w.localStorage.setItem('order' + f.item(i).id,i-1);
						w.localStorage.setItem('order' + f.item(i-1).id,i);
					}else{
						w.localStorage.setItem('order' + f.item(i).id,i);
					}
				}
				w.render_chat();
			};

			w.Arbiter.subscribe('sidebar/initialized',function(a,d){
				d.isViewportCapable = function(){ return false; };
				d.disable();
			});

			w.Env = w.require('Env');

			w.Arbiter.subscribe('buddylist-nub/initialized',function(a,c){
				var av = w.require('AvailableList'),
					sp = w.require('ShortProfiles'),
					tl = w.require('Toggler'),
					oa = w.require('debounceAcrossTransitions');

				var getAvailableList = function(){
					return av.getAvailableIDs().filter(function(r){
						switch(av.get(r)){
							case av.ACTIVE: return settings.Online;
							case av.IDLE: return settings.Idle;
							default: return false;
						}
					});
				};

				var sortAlpha = function(x,y){
					var r = sp.getNow(x), s = sp.getNow(y);
					if(!r || !s) return 0;
					var t = r.name.toLowerCase(),
						u = s.name.toLowerCase();
					return t < u ? -1 : 1;
				};

				var sortLists = function(x,y){
					if(!x.member || !y.member) return 0;
					var r = Number(w.localStorage.getItem('order' + x.uid)),
						s = Number(w.localStorage.getItem('order' + y.uid));
					if(r === s) return 0;
					return r < s ? -1 : 1;
				};

				w.render_chat = c.orderedList.render = function(){
					this.render = oa(function(){
						if(!rocki.lists) return setTimeout(this.render.bind(this),300);
						var a = getAvailableList(), b = [], c, d, e = {};
						rocki.lists.sort(sortLists);
						if(a.length > 0){
							a.sort(sortAlpha);
							for(var f = 0, g = rocki.lists.length; f < g; f++){
								if(!rocki.lists[f].member) return setTimeout(this.render.bind(this),300);
								c = a.filter(function(r){ return rocki.lists[f].member.hasOwnProperty(r); });
								if(c.length > 0){
									b.push('<li class="separator" id="' + rocki.lists[f].uid + '" onclick="toggle_list(\'' + rocki.lists[f].uid + '\');"><div class="outer"><div class="inner"><span class="text">' +
										rocki.lists[f].text + ' (' + c.length + ') <a href="#" onclick="change_order(\'' + rocki.lists[f].uid + '\');return false;">+</a> <a href="#" onclick="requireLazy([\'Dialog\'],function(a){new a().setAsyncURL(\'/ajax/choose/?type=friendlist&flid=' + rocki.lists[f].uid + '\').setAutohide(true).show();});return false;">~</a></span><div class="dive"><span class="bar"></span></div></div></div></li>');

									if(!w.localStorage.getItem('toggle' + rocki.lists[f].uid)){	
										for(var k = 0, l = c.length; k < l; k++){
											if(d = this._getListItem(c[k])){
												d.setAttribute('onclick','Chat.openTab(' + c[k] + ');');
												b.push(d); e[c[k]] = 1;
											}else{
												this._renderListItem(c[k],this.render.bind(this));
											}
										}
									}
								}
							}
							c = a.filter(function(r){ return !e.hasOwnProperty(r); });
							if(c.length > 0){
								b.push('<li class="separator" onclick="toggle_list(\'other\');"><div class="outer"><div class="inner"><span class="text">' +
									'Other (' + c.length + ')</span><div class="dive"><span class="bar"></span></div></div></div></li>');

								if(!w.localStorage.getItem('toggleother')){
									for(var k = 0, l = c.length; k < l; k++){
										if(d = this._getListItem(c[k])){
											d.setAttribute('onclick','Chat.openTab(' + c[k] + ');');
											b.push(d);
										}else{
											this._renderListItem(c[k],this.render.bind(this));
										}
									}
								}
							}
							if(settings.Mobile){
								c = av.getAvailableIDs().filter(function(r){ return av.get(r) === av.MOBILE && w.PresencePrivacy.getFriendVisibility(r) !== w.PresencePrivacy.BLACKLISTED; });
								if(c.length > 0){
									b.push('<li class="separator" onclick="toggle_list(\'mobile\');"><div class="outer"><div class="inner"><span class="text">' +
										'Mobile (' + c.length + ')</span><div class="dive"><span class="bar"></span></div></div></div></li>');
	
									if(!w.localStorage.getItem('togglemobile')){
										c.sort(sortAlpha);
										for(var k = 0, l = c.length; k < l; k++){
											if(d = this._getListItem(c[k])){
												d.setAttribute('onclick','Chat.openTab(' + c[k] + ');');
												b.push(d);
											}else{
												this._renderListItem(c[k],this.render.bind(this));
											}
										}
									}
								}
							}
						}else{
							b.push('<div style="padding:10px;">No friends online.</div>');
						}
						if(b.length > 0){
							var ul = this._root.firstChild;
							ul.innerHTML = '';
							for(var s = 0, t = b.length; s < t; s++){
								if(typeof b[s] === 'string'){
									ul.innerHTML += b[s];
								}else{
									ul.appendChild(b[s]);
								}
							}
							this.inform('render',{},this.BEHAVIOR_PERSISTENT);
						}
					}.bind(this),300,false);
					this.render();
				}.bind(c.orderedList);

				w.Arbiter.subscribe('sidebar/show',function(a,d){
					d.hide();
					c.show();
				});

				tl.createInstance(c.root).setSticky(settings.Sticky);

				c.orderedList.scrollTo = function(){ return false; };

				c.orderedList.subscribe('render',function(){
					c.label.innerHTML =
						c.root.querySelector('div.titlebarTextWrapper').innerHTML =
							'Chat (<strong>' + getAvailableList().length + '</strong>)';
				});

				var menu = d.querySelector('div.fbNubFlyoutTitlebar div.fbChatSidebarDropdown ul.uiMenuInner');
				menu.innerHTML = '<li data-label="Manage Lists" class="uiMenuItem"><a aria-checked="false" href="/bookmarks/lists" tabindex="-1" class="itemAnchor"><span class="itemLabel fsm">Manage Lists</span></a></li>' + menu.innerHTML;

				w.localStorage.setItem('togglemobile',true);

				if(w.ChatVisibility.isOnline() && settings.Onload) c.show();
			});
		},

		'getflid':function(){
			if(!w.Env) return setTimeout(this.getflid.bind(this),30);
			var a = new ajax('/ajax/typeahead/first_degree.php?__a=1&filter[0]=friendlist&lazy=0&viewer=' + w.Env.user + '&__user=' + w.Env.user);
			a.send('GET',null,function(b){
				var typeahead = eval('(' + b.responseText.substr(9) + ')');
				if(!!typeahead.payload){
					this.lists = typeahead.payload.entries;
					this.getmember();
				}
			}.bind(this));
		},

		'getmember':function(){
			var regex = /\\?"(\d+)\\?":1/g, a;
			for(var i = 0, j = this.lists.length; i < j; i++){
				a = new ajax('/ajax/choose/?type=friendlist&flid=' + this.lists[i].uid + '&view=all&__a=1&__d=1&__user=' + w.Env.user);
				a.send('GET',null,function(b,c){
					var d; this.lists[c].member = {};
					while(d = regex.exec(b.responseText)){
						this.lists[c].member[d[1]] = 1;
					}
				}.bind(this,a.XMLHttpRequest,i));
			}
		}
	};

	if(w && w.Arbiter){
		util.insertRule('\
		.fbDock {\
		margin:' + settings.Margin + '!important;\
		}\
		#fbDockChatBuddylistNub {\
		width:' + settings.Width + '!important;\
		}\
		.fbNubFlyout {\
		min-height:' + settings.MinHeight + '!important;\
		}\
		.fbChatOrderedList .separator {\
			float: left;\
			width: 100%;\
		}\
		.fbChatOrderedList .separator {\
			-moz-user-select: none;\
			display: table;\
			height: 32px;\
		}\
		.fbChatOrderedList .separator .outer {\
			display: table-cell;\
			vertical-align: middle;\
		}\
		.fbChatOrderedList .separator .outer .inner {\
			cursor: pointer;\
			position: relative;\
			text-align: center;\
			top: -50%;\
			z-index: 1;\
		}\
		.fbChatOrderedList .separator .text {\
			background-color: #FFFFFF;\
			color: #989DB3;\
			display: inline-block;\
			font-size: 9px;\
			font-weight: bold;\
			padding: 0 5px;\
			text-transform: uppercase;\
		}\
		.fbChatOrderedList .separator .dive {\
			left: 0;\
			position: absolute;\
			top: 50%;\
			width: 100%;\
			z-index: -1;\
		}\
		.fbChatOrderedList .separator .dive .bar {\
			border-bottom: 2px solid #CCD0DA;\
			display: block;\
			margin: 0 5px;\
		}\
		');

		rocki.DOMContentLoaded();
		rocki.getflid();
	}

})(unsafeWindow);