thickFaceBook

By Justin Rosenthal Last update Jun 30, 2006 — Installed 1,710 times.
// ==UserScript==

// @name           thickFaceBook

// @description    Thickbox Implementation for Facebook Photo Albums

// @include        http://*facebook.com*album.php*

// @include	  	   http://*facebook.com*photo_search*

// ==/UserScript==

//

// By: Justin Rosenthal

// Email: justin.rosenthal at gmail

// Last Update:  06/30/2006



// This script made use of the original code of Thickbox

// It was heavily modified, however.





// Original Thickbox Disclaimer & Credits:

/*

 * Thickbox - One box to rule them all.

 * By Cody Lindley (http://www.codylindley.com)

 * Under an Attribution, Share Alike License

 * Thickbox is built on top of the very light weight jquery library.

 */



// Globals

var imgPreloader;

var allImages, thisImage;

var TB_WIDTH, TB_HEIGHT;

var NXT_WIDTH, NXT_HEIGHT;

var PREV_WIDTH, PREV_HEIGHT;





allImages = document.evaluate(

	'//*[contains(@href, "photo.php?pid")]',

	document,

	null,

	XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,

	null);



var imgLinkArray = new Array();



for (var i = 0; i < allImages.snapshotLength; i++) {

	thisImage = allImages.snapshotItem(i);

	imgLinkArray.push(thisImage);



	//add thickbox to href elements that have a class of .thickbox

	//when the document is loaded

	thisImage.addEventListener(

		'click',

		function(event) {

			var t = this.firstChild.title;

			var src = this.firstChild.src;

			var path = src.substring( 0, src.lastIndexOf('/') + 1 );

			var fileName = 'n' + src.substring( src.lastIndexOf('/') + 2, src.length );

			TB_show(t, path + fileName, this.href, this);

			this.blur();

			event.stopPropagation();

			event.preventDefault();

		},

		true);

}



//function called when the user clicks on a thickbox link

function TB_show(caption, url, jumpToURL, linkObj) {

	try {

		// Find this object in the array

		var prevLink = null;

		var nextLink = null;

		for(var i=0; i < imgLinkArray.length; i++) {

			if (imgLinkArray[i].firstChild.src == linkObj.firstChild.src) {

				if (i > 0) prevLink = imgLinkArray[i-1];

				if (i < imgLinkArray.length - 1) nextLink = imgLinkArray[i+1];

			}

		}



		// div for 'next' picture

		var nextLinkDiv = document.createElement('div');

		nextLinkDiv.id = "TB_nextPicture";

		// Fill the div if there is one.

		if (nextLink != null) {

			var tmpLink = document.createElement('a');

			tmpLink.innerHTML = "<img src='" + nextLink.firstChild.src + "' title='" + nextLink.firstChild.title + "'>";

			tmpLink.href = nextLink.href;

			tmpLink.addEventListener(

				'click',

				function(event) {

					TB_remove();

					var t = this.firstChild.title;

					var src = this.firstChild.src;

					var path = src.substring( 0, src.lastIndexOf('/') + 1 );

					var fileName = 'n' + src.substring( src.lastIndexOf('/') + 2, src.length );

					TB_show(t, path + fileName, this.href, this);

					this.blur();

					event.stopPropagation();

					event.preventDefault();

				},

				true);

			nextLinkDiv.appendChild(tmpLink);

			NXT_WIDTH = tmpLink.firstChild.width;

			NXT_HEIGHT = tmpLink.firstChild.height;

		} else {

			// Find out if there is a "next page" button

			pageLinks = document.evaluate(

				'//a[contains(@href, "album.php")] | //a[contains(@href, "photo_search.php")]',

				document,

				null,

				XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,

				null);



			var thisLink;

			var nxtHref = "";

			for (var i = 0; i < pageLinks.snapshotLength; i++) {

				thisLink = pageLinks.snapshotItem(i);

				if (thisLink.innerHTML.indexOf('next') >= 0) {

					nxtHref = thisLink.href;

					i = pageLinks.snapshotLength;

				}

			}



			if (nxtHref != "") {

				var nxt = document.createElement('a');

				nxt.href = nxtHref;

				nxt.className = "pageChange";

				nxt.innerHTML = "next page";

				nextLinkDiv.appendChild(nxt);

				nextLinkDiv.style.width = "100px";

				nextLinkDiv.style.height = "50px";

				NXT_WIDTH = 100;

				NXT_HEIGHT = 50;



				// Make sure nextLinkDiv gets shown

				nextLink = true;

			}

		}

		document.body.appendChild(nextLinkDiv);



		// div for 'prev' picture

		var prevLinkDiv = document.createElement('div');

		prevLinkDiv.id = "TB_prevPicture";

		// Fill the div if there is one.

		if (prevLink != null) {

			var tmpLink = document.createElement('a');

			tmpLink.innerHTML = "<img src='" + prevLink.firstChild.src + "' title='" + prevLink.firstChild.title + "'>";

			tmpLink.href = prevLink.href;

			tmpLink.addEventListener(

				'click',

				function(event) {

					TB_remove();

					var t = this.firstChild.title;

					var src = this.firstChild.src;

					var path = src.substring( 0, src.lastIndexOf('/') + 1 );

					var fileName = 'n' + src.substring( src.lastIndexOf('/') + 2, src.length );

					TB_show(t, path + fileName, this.href, this);

					this.blur();

					event.stopPropagation();

					event.preventDefault();

				},

				true);

			prevLinkDiv.appendChild(tmpLink);

			PREV_WIDTH = tmpLink.firstChild.width;

			PREV_HEIGHT = tmpLink.firstChild.height;

		} else {

			// Find out if there is a "prev page" button

			pageLinks = document.evaluate(

				'//a[contains(@href, "album.php")] | //a[contains(@href, "photo_search.php")]',

				document,

				null,

				XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,

				null);



			var thisLink;

			var prevHref = "";

			for (var i = 0; i < pageLinks.snapshotLength; i++) {

				thisLink = pageLinks.snapshotItem(i);

				if (thisLink.innerHTML.indexOf('prev') >= 0) {

					prevHref = thisLink.href;

					i = pageLinks.snapshotLength;

				}

			}



			if (prevHref != "") {

				var prev = document.createElement('a');

				prev.href = prevHref;

				prev.className = "pageChange";

				prev.innerHTML = "prev page";

				prevLinkDiv.appendChild(prev);

				prevLinkDiv.style.width = "100px";

				prevLinkDiv.style.height = "50px";

				PREV_WIDTH = 100;

				PREV_HEIGHT = 50;



				// Make sure nextLinkDiv gets shown

				prevLink = true;

			}

		}

		document.body.appendChild(prevLinkDiv);



		// Create Overlay

		var tb_overlay = document.createElement('div')

		tb_overlay.id = "TB_overlay";

		tb_overlay.style.display = "none";

		document.body.appendChild(tb_overlay);

		yScroll = window.innerHeight + window.scrollMaxY;

		tb_overlay.style.height = yScroll +"px";

		tb_overlay.style.display = "block";



		// Create Image Window

		var tb_window = document.createElement('div')

		tb_window.id = "TB_window";

		document.body.appendChild(tb_window);



		// Loader

		var tb_load = document.createElement('div')

		tb_load.id = "TB_load";

		tb_load.innerHTML = "<div id='TB_loadContent'><h2 style='color: white; font-family: sans-serif; font-size: 2em;'>Loading...</h2></div>";

		document.body.appendChild(tb_load);





		var urlString = /.jpg|.jpeg|.png|.gif|.html|.htm/g;

		var urlType = url.match(urlString);



		if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif'){



			imgPreloader = new Image();



			imgPreloader.addEventListener(

				'load',

				function() {

					TB_WIDTH = imgPreloader.width + 30;

					TB_HEIGHT = imgPreloader.height + 60;

					document.getElementById("TB_window").innerHTML += "<img id='TB_Image' src='"+url+"' width='"+imgPreloader.width+"' height='"+imgPreloader.height+"' alt='"+caption+"'/>"

										 + "<div id='TB_closeWindow'><a href='" + jumpToURL + "' id='TB_closeWindowButton'>see comments</a></div>" + "<div id='TB_caption'>"+caption+"</div>";



					// Add 'click image to close message' if they haven't chosen to hide it yet

					try{

						if ( GM_getValue('TB_HideCloseMsg') != "1" ) {

							var closeMsg = document.createElement('div');

							closeMsg.id = "TB_closeMsg";

							var closeMsgLink = document.createElement('a');

							closeMsgLink.href = "#";

							closeMsgLink.innerHTML = "x";

							closeMsgLink.title = "Don't show this message";

							closeMsgLink.addEventListener(

								'click',

								function() {

									GM_setValue('TB_HideCloseMsg', '1');

									this.parentNode.style.display = "none";

								},

								true);

							closeMsg.appendChild(closeMsgLink);

							var closeMsgTxt = document.createElement('p');

							closeMsgTxt.innerHTML = "Click anywhere on the picture to close this window";

							closeMsg.appendChild(closeMsgTxt);

							document.getElementById("TB_caption").appendChild(closeMsg);

						}

					} catch(e) { /* If greasemonkey variable somehow is broken, just ignore */ }



					document.getElementById("TB_Image").addEventListener(

						'click',

						function(event) {

							TB_remove();

						},

						true);





					TB_position();

					document.getElementById("TB_load").style.display = "none";

					document.getElementById("TB_window").style.display = "block";

					if (nextLink != null) document.getElementById("TB_nextPicture").style.display = "block";

					if (prevLink != null) document.getElementById("TB_prevPicture").style.display = "block";



				},

				true);



			imgPreloader.src = url;

		}

	} catch(e) {

		alert( e );             // REMOVE ME BEFORE DISTRIBUTION

	}

}





function TB_remove() {

	document.body.removeChild( document.getElementById("TB_window") );

	document.body.removeChild( document.getElementById("TB_overlay") );

	document.body.removeChild( document.getElementById("TB_load") );

	document.body.removeChild( document.getElementById("TB_nextPicture") )

	document.body.removeChild( document.getElementById("TB_prevPicture") );

	return false;

}





function TB_position() {

	var de = document.documentElement;

	var w = self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;

	var h = self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;



	document.getElementById("TB_window").style.width = TB_WIDTH+"px";

	//document.getElementById("TB_window").style.height = TB_HEIGHT+"px";

	document.getElementById("TB_window").style.left = ((w - TB_WIDTH)/2)+"px";

	document.getElementById("TB_window").style.top = ((h - TB_HEIGHT)/2)+"px";



	if (NXT_WIDTH && NXT_HEIGHT) {

		document.getElementById("TB_nextPicture").style.left = (w-((((w - TB_WIDTH)/2)-NXT_WIDTH)/2)-NXT_WIDTH)+"px";

		document.getElementById("TB_nextPicture").style.top = ((h - NXT_HEIGHT)/2)+"px";

	}



	if (PREV_WIDTH && PREV_HEIGHT) {

		document.getElementById("TB_prevPicture").style.left = ((((w - TB_WIDTH)/2)-PREV_WIDTH)/2)+"px";

		document.getElementById("TB_prevPicture").style.top = ((h - PREV_HEIGHT)/2)+"px";

	}



}



function addGlobalStyle(css) {

    var head, style;

    head = document.getElementsByTagName('head')[0];

    if (!head) { return; }

    style = document.createElement('style');

    style.type = 'text/css';

    style.innerHTML = css;

    head.appendChild(style);

}





addGlobalStyle('#contentPad{margin:20px;}');

addGlobalStyle('#TB_overlay {position: absolute;top: 0;left: 0;z-index:100;width: 100%;height: 100%;background-color: #000;-moz-opacity: 0.6;opacity: 0.6;}');

addGlobalStyle('#TB_window {top: 0px;left: 0px;position: fixed;background: #fff;z-index: 102;color:#000000;display:none;border: 4px solid #525252;}');

addGlobalStyle('#TB_window img {display:block;margin: 15px 0 0 15px;border-right: 1px solid #ccc;border-bottom: 1px solid #ccc;border-top: 1px solid #666;border-left: 1px solid #666;}');

addGlobalStyle('#TB_caption{padding:5px 30px 5px 15px;font-size:1.2em;color:#000;font-weight:bold;}');

addGlobalStyle('#TB_closeWindow{margin: 0 15px 0 40px;padding:5px 0px 5px 0;float:right;}');

addGlobalStyle('#TB_load{text-align: center;position: absolute;top: 50%;left: 0px;width: 100%;overflow: visible;visibility: visible;display: block;z-index:101;}');

addGlobalStyle('#TB_loadContent {margin-left: -125px;position: absolute;top: -50px;left: 50%;width: 250px;height: 100px;visibility: visible;}');

addGlobalStyle('#TB_closeMsg p { margin: 0 0 0 0.3em; display: inline; color: gray; font-weight: normal; }');

addGlobalStyle('#TB_nextPicture { display:none;position:fixed;z-index:102;padding:5px;background-color:white;border:3px solid #525252; }');

addGlobalStyle('a.pageChange { display: block; text-align: center; font-size: 15px; padding-top: 15px; color: #3B5998; font-weight: bold; height: 35px; width: 100%;}');

addGlobalStyle('#TB_prevPicture { display:none;position:fixed;z-index:102;padding:5px;background-color:white;border:3px solid #525252; }');