There are 32 previous versions of this script.
// ==UserScript==
// @name FlickrZoom
// @namespace http://erlend.oftedal.no
// @include http://*flickr.com/*
// @include http://*.photosight.*/*
// @include http://*photosig.com/*
// @include http://*onexposure.net/*
// @include http://1x.com/*
// @include http://www.facebook.com/*
// @include http://lab.bernatcasero.com/flickr/onexplorenow/*
// @version 0.0.42
// @author Erlend Oftedal
// @description Get preview of thumbnailed images on flickr, photosight, photosig and onexposure
// ==/UserScript==
var fz_localVersion = "0.0.42";
var fz_zoomSpeed = 300;
var fz_fadeSpeed = 200;
var fz_sc;
var jQuery = null;
var fz_zoomBox;
var fz_activeThumb;
var fz_hoverThumb;
var fz_grayPanel;
var fz_loader;
var fz_endings = /_[stm].jpg$/;
var fz_buttonBar;
var fz_openButton;
var fz_closeButton;
var fz_linkButtonStyle = {color: "#aaa", fontSize: "75%", marginLeft: "5px"};
var fz_favButton;
var fz_OESelect;
var fz_OEOptions;
var fz_OESelectButton;
var fz_titleBar;
var fz_descriptionBar;
var fz_isPS = false;
var fz_isOE = false;
var fz_isPsig = false;
var fz_isFlickr = false;
var fz_isFacebook = false;
var fz_isBernat = false;
var fz_colorBar;
var fz_versionPanel;
var fz_serverVersion;
var fz_videoPanel;
function init() {
jQuery = unsafeWindow.jQuery;
if (jQuery == null) {
if (fz_sc == null) {
fz_sc = document.createElement("script");
fz_sc.src = "http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js";
document.getElementsByTagName("head")[0].appendChild(fz_sc);
}
setTimeout(init, 500);
} else {
eval("jQuery.noConflict()");
goNext();
}
}
init();
function goNext() {
checkForNewVersion();
fz_isPS = contains(document.location.href, "photosight.");
fz_isOE = contains(document.location.href, "onexposure.net") || contains(document.location.href, "/1x.com");
fz_isPsig = contains(document.location.href, "photosig.com");
fz_isFacebook = contains(document.location.href, "facebook.com");
fz_isBernat = contains(document.location.href, "lab.bernatcasero.com");
fz_isFlickr = !(fz_isPS || fz_isOE || fz_isPsig || fz_isFacebook || fz_isBernat);
inject();
fz_zoomBox = document.createElement("div");
fz_zoomBox.innerHTML = "<img src=\"http://erlend.oftedal.no/photo/icon-zoom.gif\" />";
jQuery(fz_zoomBox).css({zIndex:100, position:"absolute", cursor:"pointer"}).appendTo(jQuery("body")).hide();
fz_loader = document.createElement("img");
fz_loader.src = "http://erlend.oftedal.no/photo/ajaxloader.gif";
jQuery(fz_loader).css({position: "absolute", zIndex:50000}).appendTo(jQuery("body")).hide();
fz_zoomBox.addEventListener('mouseover', function() { jQuery(fz_zoomBox).show(); }, true);
fz_zoomBox.addEventListener('mouseout', function() { jQuery(fz_zoomBox).hide(); }, true);
fz_zoomBox.addEventListener('click', function() { zoomMe(fz_hoverThumb) }, true);
fz_grayPanel = document.createElement("div");
jQuery(fz_grayPanel).css({top: 0, left:0, position:"absolute", background:"#000000", opacity:0})
.appendTo(jQuery("body")).hide();
fz_buttonBar = document.createElement("div");
jQuery(fz_buttonBar).css(
{position:"absolute", zIndex: 9999, background:"#000", padding: "3px 0px 5px 0px", textAlign: "left"}
).appendTo(jQuery("body")).hide();
fz_closeButton = document.createElement("a");
jQuery(fz_closeButton).html("Close").css(fz_linkButtonStyle).css({float:"right", marginRight:"5px"}).appendTo(jQuery(fz_buttonBar));
fz_openButton = document.createElement("a");
jQuery(fz_openButton).html("Open image page").css(fz_linkButtonStyle).appendTo(jQuery(fz_buttonBar));
fz_favButton = document.createElement("a");
fz_OESelect = document.createElement("span");
if (fz_isOE) {
fz_OESelectButton = document.createElement("a");
jQuery(fz_OESelect).appendTo(jQuery(fz_buttonBar)).css("margin-left", 10);
jQuery(fz_OESelectButton).bind('click', function() { OEAddToAlbum(); return false; })
.appendTo(jQuery(fz_buttonBar)).html("Add to album").css(fz_linkButtonStyle);
jQuery(fz_favButton).css("padding-left", "20px");
fz_OESelectButton.href = "javascript:";
}
jQuery(fz_favButton).html("Add to faves").css(fz_linkButtonStyle).appendTo(jQuery(fz_buttonBar));
fz_closeButton.href = "javascript:";
fz_favButton.href = "javascript:";
fz_colorBar = document.createElement("div");
jQuery(fz_colorBar).css({position:"absolute"}).appendTo(jQuery(fz_grayPanel)).width(15).height(512);
var i = 0;
for (i = 0; i < 255; i++) {
var dd = document.createElement("div");
var cc = i.toString(16).toUpperCase();
if (i < 16) cc = "0" + cc;
cc = "#" + cc + cc + cc;
jQuery(dd).height(2).width(15).css({background: cc}).appendTo(jQuery(fz_colorBar));
jQuery(dd).bind('mouseover', setBgLayer);
}
jQuery(eval("document")).bind('keypress', function(e) { handleKeyPress(e); });
fz_titleBar = document.createElement("div");
jQuery(fz_titleBar).css({textAlign:"left", fontWeight:"bold", color:"#aaa", fontSize: "95%", padding: "7px 5px 5px 5px"}).appendTo(jQuery(fz_buttonBar));
fz_descriptionBar = document.createElement("div");
jQuery(fz_descriptionBar).css({textAlign:"left", color:"#aaa", fontSize: "75%", padding: "0px 5px 3px 5px"}).appendTo(jQuery(fz_buttonBar));
}
function handleKeyPress(e) {
var code = (e.keyCode ? e.keyCode : e.which);
if (fz_activeThumb != null && (code == 39 || code == 37)) {
var imgs = jQuery("img").filter(function(index) { return unWrap(this).canZoom; });
var ix = imgs.index(fz_activeThumb);
zoomMeOut(fz_activeThumb);
ix = ix + (code == 37 ? -1 : +1);
ix = (ix + imgs.length) % imgs.length;
zoomMe(imgs.get(ix));
}
}
function setBgLayer() {
jQuery(fz_grayPanel).css({opacity: 1, background: this.style.backgroundColor});
}
function inject() {
jQuery("img").each(
function(i) {
var tmb = unWrap(this);
if (!tmb.fz_evaluated) {
tmb.fz_evaluated = true;
if (isPreview(tmb)) {
tmb.addEventListener('mouseover', showZoom, true);
tmb.addEventListener('mouseout', hideZoom, true);
tmb.canZoom = true;
}
}
});
setTimeout(inject, 1000);
}
function isPreview(img) {
var url = img.src;
if (fz_isPS) {
return contains(url, "pv_") || contains(url, "fp_") || contains(url, "_icon");
} else if (fz_isOE) {
return contains(url, "-thumb") || contains(url, "/tiny/") || contains(url, "-square");
} else if (fz_isPsig) {
return contains(url, "-thumb") || contains(url, "-blur");
} else if (fz_isFacebook) {
return url.match(/http:\/\/[^\/]+(.ak.fbcdn.net|facebook.com)\/.*\/((s|q|t)[0-9_]+|[0-9_]+(s|q|t)).jpg/);
} else if (fz_isBernat) {
return url.search(fz_endings) != -1;
} else {
return url.search(fz_endings) != -1 && !contains(img.parentNode.href, "/collections/") &&
!contains(img.parentNode.href, "/sets/");
}
}
function contains(haystack, needle) {
return haystack.indexOf(needle) != -1;
}
function showZoom() {
var thumb = jQuery(this);
jQuery(fz_zoomBox).css("top", thumb.offset().top + 1).css("left", thumb.offset().left + thumb.width() - 21)
.css("z-index", 20000).show();
fz_hoverThumb = unWrap(this);
}
function hideZoom() {
jQuery(fz_zoomBox).hide();
}
function zoomMe(tmb) {
fz_activeThumb = tmb;
fz_descriptionBar.innerHTML = (tmb.description != null ? tmb.description : "");
var imgs = jQuery("img").filter(function(index) { return unWrap(this).canZoom; });
var ix = imgs.index(fz_activeThumb);
ix = (ix + 1 + imgs.length) % imgs.length;
var img = new Image();
img.src = getUrl(imgs.get(ix));
if (fz_isFlickr) {
var imgl = new Image();
imgl.src = getUrl(imgs.get(ix)).replace(".jpg", "_b.jpg");
}
try {
if (tmb.fullImg == null) {
var thumb = jQuery(tmb);
showLoader(thumb);
if (fz_isPsig) {
jQuery.get(tmb.parentNode.href, null, function (data) { extractData(tmb, data); });
} else {
buildFull(tmb);
}
} else {
zoomMeBegin(tmb);
}
}catch(e) {
alert(e);
}
return false;
}
function showLoader(jqElm) {
var loader = jQuery(fz_loader);
loader.css("top", jqElm.offset().top + (jqElm.height() - loader.height()) /2)
.css("left", jqElm.offset().left + (jqElm.width() - loader.width()) /2)
.show();
}
function hideLoader() {
jQuery(fz_loader).hide();
}
function extractData(tmb, data) {
var re = /<img src=.([^ ]+). .*? class=.outlined./;
var ar = re.exec(data);
tmb.psig_url = ar[1];
buildFull(tmb);
}
function buildFull(tmb) {
tmb.fullImg = document.createElement("img");
tmb.fullImg.thumb = this;
var img = tmb;
tmb.fullImg.addEventListener('load', function () { jQuery(fz_loader).hide();zoomMeBegin(img); }, true);
var url = getUrl(tmb);
jQuery(tmb.fullImg).css({display:"none", position:"absolute", zIndex:10000});
jQuery("body").append(tmb.fullImg);
tmb.fullImg.addEventListener('click', function() { zoomMeOut(img); } , true);
if (fz_isFlickr) {
var img_id = tmb.src.replace(/^.*\/([^\/]+)_..jpg$/, "$1");
tmb.versionlistener = {
flickr_photos_getSizes_onLoad: function(success, responseXML, responseText, params){
eval("this." + responseText);
},
jsonFlickrApi: function(data) {
var medium;
var bigger;
for(var size in data.sizes.size) {
if (data.sizes.size[size].label == "Medium") {
medium = data.sizes.size[size].source;
} else if (data.sizes.size[size].label == "Large") {
if ((data.sizes.size[size].height < jQuery(window).height())
&& (data.sizes.size[size].width < jQuery(window).width())) {
bigger = data.sizes.size[size].source;
}
} else if (data.sizes.size[size].label == "Original") {
if ((data.sizes.size[size].height < jQuery(window).height())
&& (data.sizes.size[size].width < jQuery(window).width())) {
bigger = data.sizes.size[size].source;
}
}
}
this.tmb.fullImg.src = (bigger != null ? bigger : medium);
},
tmb: tmb
}
unsafeWindow.F.API.callMethod('flickr.photos.getSizes', {"format": "json", "photo_id": img_id}, tmb.versionlistener);
tmb.listener = {
flickr_photos_getInfo_onLoad: function(success, responseXML, responseText, params){
eval("this." + responseText);
},
jsonFlickrApi: function(data) {
this.tmb.description = data.photo.description._content;
fz_descriptionBar.innerHTML = this.tmb.description;
},
tmb: tmb
}
unsafeWindow.F.API.callMethod('flickr.photos.getInfo', {"format": "json", "photo_id": img_id}, tmb.listener);
} else {
tmb.fullImg.src = url;
}
}
function getUrl(tmb) {
var url;
if (fz_isPS) {
if (document.location.href.indexOf("photosight.us") != -1) {
var re = /.*\/([0-9]+)\/([0-9]+)\/([0-9]+)\/(pv_|fp_)([0-9]+).jpg/;
var ar = re.exec(tmb.src);
url = "http://photosight.us/showimg.php?y=" + ar[1] + "&m=" + ar[2] + "&d=" + ar[3] + "&image=" + ar[5] + ".jpg";
} else {
url = tmb.src.replace("pv_", "").replace("fp_", "").replace("/tup/", "/up/").replace("prv-", "img-")
.replace("_icon", "_large");
}
} else if(fz_isPsig) {
url = tmb.psig_url;
} else if(fz_isOE) {
if (tmb.src.indexOf("/tiny/") != -1) {
url = tmb.src.replace("/tiny/" , "/").replace(".jpg", "-fullsize.jpg");
} else {
url = tmb.src.replace("pictures", "OEfullSize").replace("-thumb", "-fullsize").replace("-square", "-fullsize");
}
} else if(fz_isFacebook) {
url = tmb.src.replace(/(.*)(s|q|t)([0-9_]+.jpg)$/, "$1n$3").replace(/(.*)([0-9_]+)(s|q|t).jpg$/, "$1$2n.jpg");
} else {
url = tmb.src.replace(fz_endings, ".jpg");
}
return url;
}
function zoomMeBegin(tmb) {
jQuery(fz_buttonBar).hide();
if (fz_activeThumb != tmb) return;
var thumb = jQuery(tmb);
var full = jQuery(tmb.fullImg);
if (tmb.fullImg.originalHeight == null) {
tmb.fullImg.originalHeight = tmb.fullImg.height;
tmb.fullImg.originalWidth = tmb.fullImg.width;
}
full.width(thumb.width()).height(thumb.height())
.css("top",thumb.offset().top).css("left", thumb.offset().left)
.show();
jQuery(fz_grayPanel).stop().width(jQuery(document).width()).height(jQuery(document).height()).show().css("opacity", 0);
var cby = (jQuery(window).height() - jQuery(fz_colorBar).height()) / 2 + getScrollTop();
if (cby < 0) cby = 0;
fz_colorBar.style.top = cby;
var x = (jQuery(window).width() - tmb.fullImg.originalWidth) / 2;
var y = (jQuery(window).height() - tmb.fullImg.originalHeight) / 2 + getScrollTop();
var maxY = jQuery(document).height() - 40 - tmb.fullImg.originalHeight;
if (fz_isOE) {
maxY = jQuery("div#full").height() - 40 - tmb.fullImg.originalHeight;
}
if (y > maxY) y = maxY;
if (y < 5) y = 5;
full.css("opacity", 0).css("border", "1px solid #000");
full.stop().animate({
top: y, left: x, opacity: 1,
width: tmb.fullImg.originalWidth, height: tmb.fullImg.originalHeight
}, fz_zoomSpeed, null, function() { zoomDone(tmb); });
}
function getScrollTop() {
return jQuery(document).scrollTop();
}
function zoomDone(tmb) {
if (fz_activeThumb != tmb) { zoomMeOut(tmb); return; }
fz_openButton.href = tmb.parentNode.href;
var buttons = jQuery(fz_buttonBar);
var isVideo = false;
if (fz_isPS) {
if (!contains(tmb.src, "photosight.ru")) {
var re = /.*(pv_|fp_)([0-9]+).jpg$/;
var ar = re.exec(tmb.src);
fz_favButton.p_id = ar[2];
jQuery(fz_favButton).unbind("click").bind("click",
function() { jQuery.get("add_my.php?photoid=" + fz_favButton.p_id, null, function(data) { hideLoader(); }); return false; });
} else {
jQuery(fz_favButton).hide();
}
} else if(fz_isOE) {
var re = /.*\/([0-9]+)(-[^\/]*)?.jpg$/;
var ar = re.exec(tmb.src);
fz_favButton.p_id = ar[1];
jQuery(fz_favButton).unbind("click").bind("click",
function() { jQuery.post("/oeincludes/inc_favstate.php?id=" + fz_favButton.p_id, {"change": true}, function(data) { hideLoader(); }); return false; });
jQuery(fz_OESelect).hide();
jQuery(fz_OESelectButton).hide();
jQuery.get(fz_openButton.href, null, function(data) { OEExtract(tmb, data); });
buttons.css("border", "1px solid #111").css("border-top", "none");
} else if(fz_isPsig || fz_isFacebook || fz_isBernat){
jQuery(fz_favButton).hide();
} else {
if (tmb.parentNode.parentNode.innerHTML.indexOf("Play Video") > -1) {
drawVideoPanel(tmb);
isVideo = true;
}
fz_titleBar.innerHTML = tmb.parentNode.title;
var re = /.*\/([0-9]+)\/.*/;
var ar = re.exec(tmb.parentNode.href);
fz_favButton.p_id = ar[1];
jQuery(fz_favButton).unbind("click").bind("click",
function() { unsafeWindow.F.API.callMethod("flickr.favorites.add", {photo_id:fz_favButton.p_id}, fz_favButton); return false; });
}
jQuery(fz_closeButton).one("click", function() { zoomMeOut(tmb); return false; });
jQuery(fz_grayPanel).css({zIndex: 5000, opacity:0})
.stop().animate({opacity: 0.5}, fz_fadeSpeed);
var full = jQuery(tmb.fullImg);
buttons.width(full.width()).css("top", full.offset().top + full.height() -40).css("left", full.offset().left);
if (!isVideo) {
full.one("mouseover", function() {
buttons.show();
buttons.stop().animate({top: full.offset().top + full.height()}, 200);
});
} else {
buttons.show();
buttons.stop().animate({top: full.offset().top + full.height()}, 200);
}
}
function drawVideoPanel(tmb) {
var ar = /.*\/([^_]+)_([^_]+)_.\.jpg$/.exec(tmb.src);
fz_videoPanel = document.createElement("div");
var full = jQuery(tmb.fullImg);
jQuery(fz_videoPanel).width(full.width()).height(full.height())
.css({top: full.offset().top, left: full.offset().left, zIndex:10000})
.appendTo(jQuery("body"));
fz_videoPanel.id = "stewart_swf" + ar[1] + "_divx";
fz_videoPanel.className = "photo_gne_video_wrapper_div";
var F = unsafeWindow.F;
var _ge = unsafeWindow._ge;
F.decorate(_ge('stewart_swf' + ar[1] + '_divx'), F._stewart_swf_div).stewart_go_go_go(full.width(), full.height(), {
onsite: 'true', flickr_noAutoPlay: 'false', in_photo_gne: 'true',
photo_secret: ar[2],
photo_id: ar[1]
});
jQuery(fz_videoPanel).css({position:"absolute"});
}
function OEExtract(tmb, data) {
if (fz_activeThumb != tmb) return;
var form = data.substring(data.indexOf('<form id="album"'));
form = form.substring(0, data.indexOf("</form>") + 7);
var d = document.createElement("div");
d.innerHTML = form;
var select = jQuery(d).find("select").css("font-size", "75%").get(0);
fz_OEOptions = new Array();
jQuery(d).find("input").each( function() { fz_OEOptions[this.name] = this.value; });
jQuery(fz_OESelect).html(select).show();
jQuery(fz_OESelectButton).show().html("Add to album");
}
function OEAddToAlbum() {
showLoader(jQuery(fz_activeThumb.fullImg));
var select = jQuery(fz_OESelect).children().get(0);
if (select.value != "") {
fz_OEOptions["add_to_album"] = select.value;
jQuery.post("http://www.onexposure.net/?photos=latest-additions&photo=" + fz_OEOptions["id"], fz_OEOptions,
function(data) { hideLoader(); }
);
}
}
function zoomMeOut(tmb) {
fz_activeThumb = null;
if (fz_videoPanel != null) {
jQuery(fz_videoPanel).hide().html("");
fz_videoPanel.id = "";
}
jQuery(fz_buttonBar).hide();
jQuery(fz_grayPanel).stop().animate({opacity: 0}, fz_fadeSpeed, null, function() { jQuery(fz_grayPanel).css("z-index", 15000).hide(); });
var thumb = jQuery(tmb);
if (tmb.fullImg != null) {
var full = jQuery(tmb.fullImg);
full.stop().animate({
top: thumb.offset().top, left: thumb.offset().left, opacity: 0,
width: thumb.width(), height: thumb.height()
}, fz_zoomSpeed, null, function () { full.hide(); jQuery(fz_buttonBar).hide(); });
}
}
function closeVersionBar() {
GM_setValue("ignored_version", fz_serverVersion);
fz_versionPanel.hide();
}
function checkForNewVersion() {
var iupd = GM_getValue("ignored_version", "");
var d = new Date();
var ss = ("" + d.getFullYear()) + toTwoLetter(d.getMonth() + 1) + toTwoLetter(d.getDate());
var ys = parseFloat(ss);
var upd = GM_getValue("checked_for_new_version", 0);
if(ys > upd){
GM_setValue("checked_for_new_version", ys);
GM_xmlhttpRequest({
method: "GET",
url: 'http://userscripts.org/scripts/review/29151',
headers:{'Content-type':'application/x-www-form-urlencoded'},
data:'',
onload:function(result) {
var res = result.responseText;
var re = /@version[ ]+([0-9.]+)/gm;
var ar = re.exec(res);
fz_serverVersion = ar[1] + "";
if (fz_serverVersion > fz_localVersion && fz_serverVersion > iupd){
fz_versionPanel = jQuery("<div />").css({backgroundColor: "#1057AE", color: "#fff", fontWeight: "bold", "padding": "5px 5px 5px 5px"}).html("A new version of FlickrZoom is available: ");
fz_versionPanel.prependTo("body");
jQuery('<a href="http://userscripts.org/scripts/show/29151" target="_blank">Download</a>').css({color: "#fff"}).appendTo(fz_versionPanel);
var ignLink = document.createElement("a");
jQuery(ignLink).css({color: "#fff", marginLeft:"5px"}).appendTo(fz_versionPanel).text("Ignore").attr("href", "javascript:");
ignLink.addEventListener('click', closeVersionBar, true);
}
}
});
}
}
function toTwoLetter(number) {
return ("" + (number + 100)).substring(1,3);
}
function unWrap(elm) {
return elm.wrappedJSObject || elm;
}
