There are 2 previous versions of this script.
// ==UserScript==
// @name Facebook View Photo in Album
// @description Adds a link above photos to see them in their albums, even if you're not friends with the photographer. Adds links to view all photos of a user together (regardless of who took them). Adds links to view whole galleries/albums on one page.
// @namespace znerp
// @include http://*.facebook.com/photo.php?*
// @include http://*.facebook.com/photo_search.php?*
// @include http://*.facebook.com/album.php?*
// @include http://*.facebook.com/photos.php?subj=*
// @include http://*.facebook.com/*
// ==/UserScript==
//document.addEventListener('click', function() { window.setTimeout(inYoFace, 1000);} , true);
document.getElementById("content").addEventListener('DOMNodeInserted', function() { window.setTimeout(inYoFace, 5000);}, true);
window.addEventListener('load', inYoFace, true);
currentLocation = ""
inYoFace()
function inYoFace() {
if (document.location.href != currentLocation) {
currentLocation = document.location.href
link = document.location.href;
foo = document.location.href.slice(document.location.href.lastIndexOf("/"), document.location.href.length)
if (/photo\.php\?/.test(foo)) {
h4 = document.getElementById("content").getElementsByTagName("h4")[0];
if (foo.indexOf("&op=") != -1) {
if (!/See this Photo in its Album/.test(h4.innerHTML)) {
newThing = link.replace(/(^.*photo.php\?).*(pid=\d+).*(&id=\d+).*/, '$1$2$3')
h4.innerHTML += '<span class="pipe">|</span><a href='+newThing+' style="cursor:pointer;">See this Photo in its Album</a>';
}
} else if (!document.getElementById("photo_count").parentNode.innerHTML.match(/Back to Album/i)) {
h4.innerHTML += '<span class="pipe">|</span><a style="cursor:pointer;" title="WARNING: This can have a VERY slow load time.">Back to Album</a>';
h4.getElementsByTagName("a")[0].addEventListener('click', showGallery, true);
}
// Made obsolete by new Facebook.
/*} else if (/photo_search\.php\?id=\d+$/.test(foo)) {
name = document.getElementById("content").getElementsByTagName("h2")[0].innerHTML.match(/Photos of ([\w]+)/i)[1];
link = document.location.href + "&aid=1&auser=1&view=all"
h4.innerHTML += '<span class="pipe">|</span><a href='+link+'>View All Photos of '+name+'</a>';*/
} else if (/photos\.php\?/.test(foo)) {
strangers = document.evaluate('//a[contains(@href, ".facebook.com/s.php?k=100000080&id=")]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (i = strangers.snapshotLength - 1; i >= 0; i--) {
albumThing = strangers.snapshotItem(i).parentNode.parentNode.parentNode;
links = albumThing.getElementsByTagName("a");
photo = albumThing.getElementsByTagName("img")[0].src.match(/_(\d+)_\d+\.jpg/)[1];
for (j = links.length - 1; j >=0 ; j--) {
if (/aid=/.test(links[j].href)) {
links[j].href = links[j].href.replace(/album\.php\?aid=\d+/ig, "photo.php?pid=" + photo)
if (/View Album/i.test(links[j].textContent)) links[j].textContent = "View Photo"
}
}
}
} else if (/\/profile\.php\?id=\d+&v=photos$/.test(foo)) {
navLinks = document.evaluate('//div[@id="photosofme_wrapper_pager"]/ul[@class="pagerpro"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
li = document.createElement("li");
li.innerHTML = '<a style="cursor:pointer;">(View All Photos)</a>'
li.addEventListener(
"click",
function addProfileImages() {
keepGoing = true;
navLinks = this.parentNode;
personId = foo.match(/\/profile\.php\?id=(\d+)&v=photos$/)[1]
userId = document.getElementById("fb_menu_profile").getElementsByTagName("a")[0].href.match(/\d+/)[0]
currentNo = parseInt(document.evaluate('//div[@id="photosofme_wrapper_pager"]/ul[@class="pagerpro"]/li[@class="current"]/a', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent);
nextNo = currentNo + 1;
prevNo = currentNo - 1;
prevDone = false;
nextDone = false;
tryAgainCount = 0
function getPage(link, prev) {
GM_xmlhttpRequest({
method: 'get',
headers: {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Content-type': 'application/x-www-form-urlencoded'
},
url: link,
onload: function (result) {
res = result.responseText;
if (res != "") {
tryAgainCount = 0
if (keepGoing) {
images = res.slice(res.indexOf("<div"), res.indexOf("div>") + 4).replace(/\\"/g, '"').replace(/\\\//g, "/");
prev ? document.getElementById("photosofme_wrapper").innerHTML = images + document.getElementById("photosofme_wrapper").innerHTML
: document.getElementById("photosofme_wrapper").innerHTML += images;
if (!/<div/.test(res))
prev ? prevDone = true : nextDone = true
else
getPage("http://www.facebook.com/ajax/photos.php?id=" + personId + "&vm=photosofme&viewer=" + userId + "&s=" + (prev ? prevNo-- : nextNo++) + "&v=photos", prev)
if (prevDone && nextDone)
navLinks.parentNode.removeChild(navLinks);
}
} else if (tryAgainCount < 3) {
getPage(link, prev);
tryAgainCount++;
} else {
navLinks.parentNode.removeChild(navLinks);
alert("The next page cannot be loaded at this time.\n\nPlease refresh and try again.")
}
}
});
}
if (navLinks.innerHTML.match(/prev/i))
getPage("http://www.facebook.com/ajax/photos.php?id=" + personId + "&vm=photosofme&viewer=" + userId + "&s=" + prevNo-- + "&v=photos", true)
else
prevDone = true
if (navLinks.innerHTML.match(/next/i))
getPage("http://www.facebook.com/ajax/photos.php?id=" + personId + "&vm=photosofme&viewer=" + userId + "&s=" + nextNo++ + "&v=photos", false)
else
nextDone = true
navLinks.innerHTML = "<a style='cursor: pointer;'>(Stop Loading Images)</a>"
navLinks.addEventListener(
"click",
function(event) {
keepGoing = false;
this.parentNode.removeChild(this);
},
true);
}, true);
navLinks.appendChild(li);
}
navLinks = document.evaluate('//ul[@class="pagerpro"]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
if (!/&v=photos#?$/.test(document.location.href) && /album\.php/.test(document.location.href)) {
for (i = navLinks.snapshotLength - 1; i >= 0; i--) {
li = document.createElement("li");
li.innerHTML = '<a style="cursor:pointer;">(View All Photos)</a>'
li.addEventListener(
"click",
function addImages() {
keepGoing = true;
navLinks = this.parentNode;
function getPage(link, prev) {
GM_xmlhttpRequest({
method: 'get',
headers: {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Content-type': 'application/x-www-form-urlencoded'
},
url: link,
onload: function (result) {
res = result.responseText;
if (keepGoing) {
images = res.slice(res.indexOf('<div class="UIPhotoGrid_Container'),
res.indexOf('</div>', res.indexOf('<div class="UIPhotoGrid_Container')));
prev ? document.getElementById("album_container").innerHTML = images + document.getElementById("album_container").innerHTML
: document.getElementById("album_container").innerHTML += images;
h4 = document.getElementById("content").getElementsByTagName("h4")[0];
numbers = h4.innerHTML.replace(/(\d+),(\d+)/, "$1$2").match(/Photos (\d+) - (\d+) out of (\d+)/)
for (i = 0; i < 3; i++) numbers[i] = parseInt(numbers[i]);
prev ? (numbers[1] -= 20) : (numbers[2] = Math.min(numbers[2]+20, numbers[3]));
newString = "Photos " + numbers[1] + " - " + numbers[2] + " out of " + commas(numbers[3]);
h4.innerHTML = h4.innerHTML.replace(/Photos \d+ - \d+ out of \d+(,\d+)?/, newString);
if ((numbers[1] == 1) && (numbers[2] == numbers[3])) {
navLinks.parentNode.removeChild(navLinks);
} else if ((prev && (numbers[1] != 1)) || (!prev && (numbers[2] != numbers[3]))) {
pageNumber = parseInt(link.match(/page=(\d+)/)[1]) + (prev ? -1 : 1);
getPage(link.replace(/page=\d+/, "page="+pageNumber), prev);
}
}
}
});
}
if (navLinks.innerHTML.match(/prev/))
getPage((navLinks.getElementsByTagName("a"))[0].href, true)
if (navLinks.innerHTML.match(/next/))
getPage((links = navLinks.getElementsByTagName("a"))[links.length - 2].href, false)
navLinks.innerHTML = "<a style='cursor: pointer;'>(Stop Loading Images)</a>"
navLinks.addEventListener(
"click",
function(event) {
keepGoing = false;
this.parentNode.removeChild(this);
},
true);
moreLinks = document.evaluate('//ul[@class="pagerpro"]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (j = moreLinks.snapshotLength - 1; j >= 0; j--) {
if (moreLinks.snapshotItem(j) != navLinks)
moreLinks.snapshotItem(j).removeChild(moreLinks.snapshotItem(j).lastChild);
}
}, true)
navLinks.snapshotItem(i).appendChild(li);
}
}
}
}
function commas(number) {
return (number + "").replace(/(\d)(?=(\d{3})+\b)/g,'$1,')
}
function showGallery() {
photoNumbers = document.getElementById("photo_count").textContent.split(" ");
newDiv = document.createElement("div");
newDiv.setAttribute("id", "album");
document.getElementById("photoborder").parentNode.insertBefore(newDiv, document.getElementById("photoborder"));
document.getElementById("photoborder").style.display = "none";
document.getElementById("photoinfo").style.display = "none";
document.getElementById("content").getElementsByTagName("h4")[0].style.display = "none";
document.getElementById("content").getElementsByTagName("ul")[0].style.display = "none";
table = document.createElement("table");
for (i = 0; i < photoNumbers[3]; i++) {
if (i % 5 == 0)
row = document.createElement("tr");
cell = document.createElement("td");
a = document.createElement("a");
img = document.createElement("img");
img.setAttribute("id", "znerp" + (i+1));
img.setAttribute("style", "max-width:130px;");
a.appendChild(img);
cell.appendChild(a);
row.appendChild(cell);
if (i % 4 == 3)
table.appendChild(row);
}
if (photoNumbers[3] % 4) table.appendChild(row);
document.getElementById("album").appendChild(table);
var count = 0;
addNextImage(document.location.href);
function addNextImage(nextLink) {
if (count < photoNumbers[3]) {
GM_xmlhttpRequest({
method: 'get',
headers: {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Content-type': 'application/x-www-form-urlencoded'
},
url: nextLink,
onload: function (result) {
res = result.responseText;
if (res.indexOf("you may not have permission to view this page") != -1) {
document.getElementById("page_body").setAttribute("class", "pagebody error404 basic")
document.title = "Facebook | Unable to load album"
document.getElementById("content").innerHTML = "<h2>ERROR - The <i>Facebook View Photo in Album</i> script it unable to load this album.</h2><p>It may be temporarily unavailable, or the album owner may have set their privacy options such that it is not possible to view the rest of this album.</p><ul><li><span><a href=\"" + document.location.href + "\">Reload image</a></span></li><li><span><a href=\"http://www.facebook.com/home.php\">Return home</a></span></li></ul>"
document.getElementById("content").setAttribute("style", "padding: 30px 80px 20px 30px")
document.body.setAttribute("class", "error404 basic chat_body")
} else {
image = res.slice(res.indexOf('img src="', res.indexOf('id="myphotolink"')) + 9,
(res.indexOf('"', res.indexOf('img src="', res.indexOf('id="myphotolink"')) + 9))).replace(/\/n/, "/s");
title = (res.slice(res.indexOf('<div id="photocaption">') + 23,
res.indexOf('</div>', res.indexOf('<div id="photocaption">')))).replace(/"/g, '"').replace(/&/g, "&").replace(/'/g, "'");
photoNumber = parseInt(res.slice(res.indexOf('Photo', res.indexOf('<span id="photo_count">')) + 6,
res.indexOf(' of', res.indexOf('<span id="photo_count">'))));
document.getElementById("znerp" + photoNumber).src = image;
document.getElementById("znerp" + photoNumber).parentNode.href = nextLink;
if (title != "") document.getElementById("znerp" + photoNumber).title = title;
addNextImage("http://www.facebook.com/" + res.slice(res.indexOf('a href="', res.indexOf('id="photonav_prev"')) + 8,
res.indexOf('" id="photonav_next"')).replace("&", "&"));
}
}
});
count++;
}
}
}
