create repo for 0x2620.org/jpg
This commit is contained in:
commit
2aadd63e2b
14 changed files with 7375 additions and 0 deletions
767
js/jpg.js
Normal file
767
js/jpg.js
Normal file
|
|
@ -0,0 +1,767 @@
|
|||
/*
|
||||
2010 0x2620.org GPL v3
|
||||
TODO: migrate to ox.js
|
||||
(& sorry for the mess)
|
||||
*/
|
||||
|
||||
|
||||
$(function() {
|
||||
|
||||
if ($.browser.msie) {
|
||||
alert("Please use Firefox, Safari or Chrome.");
|
||||
return;
|
||||
}
|
||||
|
||||
var $body = $("body"),
|
||||
$document = $(document),
|
||||
$window = $(window),
|
||||
$album = $("#album"),
|
||||
json,
|
||||
users = [],
|
||||
albums = {},
|
||||
split = location.hash.substr(1).replace("_", " ").split("/"),
|
||||
user = split[0] || "S",
|
||||
album = split[1] || "Beirut",
|
||||
photoid = split[2] || "",
|
||||
hash = photoid ? [user, album, photoid].join("/") : [user, album].join("/"),
|
||||
windowWidth = $window.width(),
|
||||
windowHeight = $window.height() - 24,
|
||||
windowRatio = windowWidth / windowHeight,
|
||||
photo = -1,
|
||||
photos = [],
|
||||
thumbnails = [],
|
||||
playInterval,
|
||||
buttonTimeout,
|
||||
$layer,
|
||||
spinner;
|
||||
|
||||
location.hash = hash;
|
||||
|
||||
$.each(["Loading", "Close", "Previous", "Play", "Pause", "Next", "ZoomIn", "ZoomOut"], function(i, name) {
|
||||
$("<img>").attr({
|
||||
src: "png/symbol" + name + ".png"
|
||||
});
|
||||
});
|
||||
|
||||
function Album(username, albumname) {
|
||||
var that = this,
|
||||
data = json[username][albumname];
|
||||
that.show = function() {
|
||||
playInterval && $("#play").trigger("click");
|
||||
$("#zoomin").attr("src") == "png/symbolZoomOut.png" && $("#zoomin").trigger("click");
|
||||
$(".photo") && $("#close").trigger("click");
|
||||
$album.empty();
|
||||
album = albumname;
|
||||
photos = [];
|
||||
photo = -1;
|
||||
$.each(data, function(i, image) {
|
||||
photos[i] = image,
|
||||
thumbnails[i] = new Thumbnail(i).show();
|
||||
});
|
||||
$("<br/>").attr({clear: "all"}).appendTo($album);
|
||||
$("<div>")
|
||||
.css({
|
||||
height: "24px"
|
||||
})
|
||||
.appendTo($album);
|
||||
$interface = $("<div>")
|
||||
.attr({
|
||||
id: "interface"
|
||||
})
|
||||
.appendTo($album);
|
||||
$layer = $("<div>")
|
||||
.attr({
|
||||
id: "layer"
|
||||
})
|
||||
.appendTo($album);
|
||||
setTimeout(function() {
|
||||
location.hash = [user, album.replace(" ", "_")].join("/");
|
||||
}, 500);
|
||||
return that;
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
function Button(photo, name, tooltip) {
|
||||
var that = this,
|
||||
$div = $("<div>")
|
||||
.addClass("button")
|
||||
.mouseenter(showTooltip)
|
||||
.mouseleave(hideTooltip)
|
||||
.click(function() {
|
||||
hideTooltip();
|
||||
photo.click(name);
|
||||
}),
|
||||
$img = $("<img>")
|
||||
.addClass("button")
|
||||
.attr({
|
||||
id: name.toLowerCase().replace(" ", ""),
|
||||
src: "png/symbol" + name.replace(" ", "") + ".png",
|
||||
})
|
||||
.appendTo($div),
|
||||
$tooltip;
|
||||
function hideTooltip() {
|
||||
$tooltip.animate({
|
||||
opacity: 0
|
||||
}, 50, function() {
|
||||
$tooltip.remove();
|
||||
});
|
||||
}
|
||||
function showTooltip() {
|
||||
$tooltip.html(that.tooltip).appendTo($body).animate({
|
||||
opacity: 1
|
||||
}, 50);
|
||||
}
|
||||
that.tooltip = tooltip;
|
||||
that.show = function() {
|
||||
$div.appendTo("#buttons");
|
||||
$tooltip = $("<div>")
|
||||
.addClass("tooltip")
|
||||
.css({
|
||||
left: ($div.offset().left - 52) + "px"
|
||||
});
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
function Dialog(title, text, buttons) {
|
||||
var that = this,
|
||||
$div = $("<div>")
|
||||
.addClass("background");
|
||||
$dialog = $("<div>")
|
||||
.addClass("dialog")
|
||||
.appendTo($div);
|
||||
$title = $("<div>")
|
||||
.addClass("title")
|
||||
.html(title)
|
||||
.appendTo($dialog);
|
||||
$text = $("<div>")
|
||||
.addClass("text")
|
||||
.html(text)
|
||||
.appendTo($dialog);
|
||||
$buttons = $("<div>")
|
||||
.addClass("buttons")
|
||||
.appendTo($dialog);
|
||||
new Input("Close", function() {
|
||||
that.close();
|
||||
}, $buttons).show();
|
||||
that.close = function() {
|
||||
$div.animate({
|
||||
opacity: 0
|
||||
}, 250, function() {
|
||||
$div.remove();
|
||||
});
|
||||
$dialog.animate({
|
||||
opacity: 0
|
||||
}, 250);
|
||||
return that;
|
||||
}
|
||||
that.open = function() {
|
||||
$div.appendTo($body).animate({
|
||||
opacity: 1
|
||||
}, 250);
|
||||
$dialog.animate({
|
||||
opacity: 1
|
||||
}, 250);
|
||||
return that;
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
function Input(name, fn, $parent) {
|
||||
var that = this,
|
||||
$parent = $parent || $("#right"),
|
||||
$div = $("<div>")
|
||||
.addClass("input")
|
||||
.html(name)
|
||||
.click(fn);
|
||||
that.show = function() {
|
||||
$parent.append($div);
|
||||
return that;
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
function Map() {
|
||||
var that = this,
|
||||
offset = $(".original").offset(), // fixme: needed?
|
||||
thumbnailWidth = 90 * photos[photo].width / photos[photo].height,
|
||||
thumbnailHeight = 90,
|
||||
boxWidth = thumbnailWidth / photos[photo].width * windowWidth,
|
||||
boxHeight = thumbnailHeight / photos[photo].height * windowHeight,
|
||||
$div = $("<div>")
|
||||
.addClass("map")
|
||||
.css({
|
||||
width: thumbnailWidth + "px"
|
||||
}),
|
||||
$img = $("<img>")
|
||||
.addClass("map")
|
||||
.attr({
|
||||
src: photos[photo].file.replace("/IMG", "/90/IMG"),
|
||||
})
|
||||
.css({
|
||||
width: thumbnailWidth + "px"
|
||||
})
|
||||
.appendTo($div),
|
||||
$interface = $("<div>")
|
||||
.addClass("interface")
|
||||
.css({
|
||||
width: thumbnailWidth + "px"
|
||||
})
|
||||
.click(function(e) {
|
||||
var offset = $div.offset(),
|
||||
left = Math.min(Math.max(e.clientX - offset.left - boxWidth / 2 - 2, 0), thumbnailWidth - boxWidth),
|
||||
top = Math.min(Math.max(e.clientY - offset.top + $body.scrollTop() - boxHeight / 2 - 2, 0), thumbnailHeight - boxHeight);
|
||||
$(".original").animate({
|
||||
left: -(left * photos[photo].width / thumbnailWidth) + "px",
|
||||
top: -(top * photos[photo].height / thumbnailHeight) + "px"
|
||||
}, 250, function() {
|
||||
that.update(true);
|
||||
});
|
||||
})
|
||||
.appendTo($div);
|
||||
$box = $("<div>")
|
||||
.addClass("box")
|
||||
.css({
|
||||
width: boxWidth + "px",
|
||||
height: boxHeight + "px"
|
||||
})
|
||||
.mousedown(function(e) {
|
||||
var left = parseInt($box.css("left")) + 2,
|
||||
top = parseInt($box.css("top")) + 2,
|
||||
x = e.clientX,
|
||||
y = e.clientY;
|
||||
$window.mousemove(function(e) {
|
||||
left = Math.min(Math.max(left + e.clientX - x, 0), thumbnailWidth - boxWidth);
|
||||
top = Math.min(Math.max(top + e.clientY - y, 0), thumbnailHeight - boxHeight);
|
||||
x = e.clientX;
|
||||
y = e.clientY;
|
||||
$(".original").css({
|
||||
left: -(left * photos[photo].width / thumbnailWidth) + "px",
|
||||
top: -(top * photos[photo].height / thumbnailHeight) + "px"
|
||||
});
|
||||
that.update();
|
||||
});
|
||||
$window.mouseup(function() {
|
||||
$window.unbind("mousemove");
|
||||
});
|
||||
})
|
||||
.appendTo($div);
|
||||
that.show = function() {
|
||||
$div.appendTo($album);
|
||||
that.update();
|
||||
return that;
|
||||
}
|
||||
that.update = function(animate) {
|
||||
var left = -parseInt($(".original").css("left")) * thumbnailWidth / photos[photo].width - 2,
|
||||
top = -parseInt($(".original").css("top")) * thumbnailHeight / photos[photo].height - 2;
|
||||
if (animate) {
|
||||
$box.animate({
|
||||
left: left + "px",
|
||||
top: top + "px"
|
||||
}, 250);
|
||||
} else {
|
||||
$box.css({
|
||||
left: left + "px",
|
||||
top: top + "px"
|
||||
});
|
||||
}
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
function Photo(i) {
|
||||
var that = this,
|
||||
image = photos[i],
|
||||
id = image.file.substr(-8, 4),
|
||||
title = image.file.substr(4, 8), // fixme: needed?
|
||||
zoomedIn = false,
|
||||
keepVisible = false,
|
||||
$buttons = $("<div>")
|
||||
.attr({
|
||||
id: "buttons"
|
||||
})
|
||||
.mouseenter(function() {
|
||||
//console.log("mouseenter")
|
||||
clearTimeout(buttonTimeout);
|
||||
keepVisible = true;
|
||||
})
|
||||
.mouseleave(function() {
|
||||
buttonTimeout = setTimeout(hideButtons, 2500);
|
||||
keepVisible = false;
|
||||
})
|
||||
.appendTo($body),
|
||||
map;
|
||||
$img = $("<img>")
|
||||
.addClass("photo")
|
||||
.attr({
|
||||
src: image.file.replace("/IMG", "/90/IMG"),
|
||||
});
|
||||
$.each([
|
||||
["Close", "CLOSE [ESCAPE]"],
|
||||
["Previous", "PREVIOUS [LEFT]"],
|
||||
["Play", "PLAY/PAUSE [SPACE]"],
|
||||
["Next", "NEXT [RIGHT]"],
|
||||
["Zoom In", "ZOOM [=/-]"]
|
||||
], function(i, button) {
|
||||
new Button(that, button[0], button[1]).show();
|
||||
});
|
||||
function getOriginalCSS(i) {
|
||||
return {
|
||||
width: photos[i].width + "px",
|
||||
height: photos[i].height + "px"
|
||||
};
|
||||
}
|
||||
function getPhotoCSS(i) {
|
||||
var size = getSize(i);
|
||||
return {
|
||||
left: ((windowWidth - size.width) / 2) + "px",
|
||||
top: ((windowHeight - size.height) / 2) + "px",
|
||||
width: size.width + "px",
|
||||
height: size.height + "px"
|
||||
};
|
||||
}
|
||||
function getSize(i) {
|
||||
var photoRatio = photos[i].width / photos[i].height;
|
||||
return {
|
||||
width: windowRatio > photoRatio ? windowHeight * photoRatio : windowWidth,
|
||||
height: windowRatio > photoRatio ? windowHeight : windowWidth / photoRatio
|
||||
};
|
||||
}
|
||||
function hideButtons() {
|
||||
return;
|
||||
//console.log("hideButtons")
|
||||
$("#buttons").animate({
|
||||
opacity: 0
|
||||
}, 250);
|
||||
}
|
||||
function showButtons() {
|
||||
//console.log("showButtons")
|
||||
clearTimeout(buttonTimeout);
|
||||
$("#buttons").animate({
|
||||
opacity: 1
|
||||
}, 250);
|
||||
buttonTimeout = setTimeout(hideButtons, 2500);
|
||||
}
|
||||
that.click = function(button) {
|
||||
//console.log("click " + button)
|
||||
if (button == "Close") {
|
||||
that.close();
|
||||
} else if (button == "Previous") {
|
||||
photo = photo == 0 ? photos.length - 1 : photo - 1;
|
||||
that.show(photo);
|
||||
playInterval && updateInterval();
|
||||
} else if (button == "Play") {
|
||||
if (!playInterval) {
|
||||
$("#play").attr({
|
||||
src: "png/symbolPause.png"
|
||||
});
|
||||
playInterval = setInterval(function() {
|
||||
$("#next").trigger("click");
|
||||
}, 5000);
|
||||
setTimeout(function() {
|
||||
$("#next").trigger("click");
|
||||
}, 500);
|
||||
} else {
|
||||
$("#play").attr({
|
||||
src: "png/symbolPlay.png"
|
||||
});
|
||||
clearInterval(playInterval);
|
||||
playInterval = 0;
|
||||
}
|
||||
} else if (button == "Next") {
|
||||
photo = photo == photos.length - 1 ? 0 : photo + 1;
|
||||
that.show(photo);
|
||||
playInterval && updateInterval();
|
||||
} else if (button == "Zoom In") {
|
||||
var left = (photos[photo].width - windowWidth) / -2,
|
||||
top = (photos[photo].height - windowHeight) / -2,
|
||||
x, y;
|
||||
if (!zoomedIn) {
|
||||
zoomedIn = true;
|
||||
spinner = new Spinner().start();
|
||||
var $img_ = $("<img>")
|
||||
.attr({
|
||||
src: photos[photo].file
|
||||
})
|
||||
.load(function() {
|
||||
$img.attr({
|
||||
src: photos[photo].file
|
||||
});
|
||||
spinner.stop();
|
||||
});
|
||||
$img
|
||||
.animate({
|
||||
width: photos[photo].width,
|
||||
height: photos[photo].height,
|
||||
left: left,
|
||||
top: top
|
||||
}, 250, function() {
|
||||
$("#zoomin").attr({
|
||||
src: "png/symbolZoomOut.png"
|
||||
});
|
||||
$img.addClass("original");
|
||||
$interface
|
||||
.show()
|
||||
.mousedown(function(e) {
|
||||
left = parseInt($img.css("left"));
|
||||
top = parseInt($img.css("top"));
|
||||
x = e.clientX;
|
||||
y = e.clientY;
|
||||
$window.mousemove(function(e) {
|
||||
left = Math.max(Math.min(left + e.clientX - x, 0), windowWidth - photos[photo].width);
|
||||
top = Math.max(Math.min(top + e.clientY - y, 0), windowHeight - photos[photo].height);
|
||||
x = e.clientX;
|
||||
y = e.clientY;
|
||||
$img.css({
|
||||
left: left + "px",
|
||||
top: top + "px"
|
||||
});
|
||||
map.update();
|
||||
});
|
||||
$window.mouseup(function() {
|
||||
$window.unbind("mousemove");
|
||||
});
|
||||
});
|
||||
map = new Map().show();
|
||||
});
|
||||
} else {
|
||||
zoomedIn = false;
|
||||
$(".map").remove();
|
||||
$interface.hide();
|
||||
spinner = new Spinner().start();
|
||||
var $img_ = $("<img>")
|
||||
.attr({
|
||||
src: photos[photo].file.replace("/IMG", "/720/IMG")
|
||||
})
|
||||
.load(function() {
|
||||
$img.attr({
|
||||
src: photos[photo].file.replace("/IMG", "/720/IMG")
|
||||
});
|
||||
spinner.stop();
|
||||
});
|
||||
$img.animate(getPhotoCSS(photo), 250, function() {
|
||||
$("#zoomin").attr({
|
||||
src: "png/symbolZoomIn.png"
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
function updateInterval() {
|
||||
clearInterval(playInterval);
|
||||
playInterval = setInterval(function() {
|
||||
$("#next").trigger("click");
|
||||
}, 5000);
|
||||
}
|
||||
return that;
|
||||
}
|
||||
that.close = function() {
|
||||
var thumbnailPosition = thumbnails[photo].position();
|
||||
if (playInterval) {
|
||||
$("#play").trigger("click");
|
||||
}
|
||||
$("#buttons").remove();
|
||||
$(".map").remove();
|
||||
$img.animate({
|
||||
left: thumbnailPosition.left,
|
||||
top: thumbnailPosition.top,
|
||||
width: thumbnailPosition.width,
|
||||
height: thumbnailPosition.height
|
||||
}, 250, function() {
|
||||
location.hash = [user, album].join("/");
|
||||
$img.unbind("mouseenter");
|
||||
$img.unbind("mouseleave");
|
||||
$img.unbind("mousemove");
|
||||
$img.remove();
|
||||
});
|
||||
$layer.animate({
|
||||
opacity: 0
|
||||
}, 250, function() {
|
||||
$layer.hide();
|
||||
});
|
||||
spinner.stop();
|
||||
$interface.hide();
|
||||
$document.unbind("keydown");
|
||||
return that;
|
||||
}
|
||||
that.open = function() {
|
||||
var thumbnailPosition = thumbnails[i].position();
|
||||
$img.css({
|
||||
left: thumbnailPosition.left,
|
||||
top: thumbnailPosition.top,
|
||||
width: thumbnailPosition.width,
|
||||
height: thumbnailPosition.height
|
||||
})
|
||||
.appendTo($album)
|
||||
.animate(getPhotoCSS(i), 250, function() {
|
||||
location.hash = [user, album, id].join("/");
|
||||
spinner = new Spinner().start();
|
||||
var $img_ = $("<img>")
|
||||
.attr({
|
||||
src: photos[i].file.replace("/IMG", "/720/IMG")
|
||||
})
|
||||
.load(function() {
|
||||
$img.attr({
|
||||
src: photos[i].file.replace("/IMG", "/720/IMG")
|
||||
});
|
||||
spinner.stop();
|
||||
});
|
||||
/*
|
||||
$img.mouseenter(showButtons)
|
||||
.mouseleave(hideButtons)
|
||||
.mousemove(function() {
|
||||
if (!keepVisible) {
|
||||
showButtons();
|
||||
}
|
||||
});
|
||||
*/
|
||||
showButtons();
|
||||
$document.keydown(function(e) {
|
||||
//console.log(e.keyCode);
|
||||
var d = 0;
|
||||
if (photo > -1) {
|
||||
if (e.keyCode == 27) {
|
||||
$("#close").trigger("click");
|
||||
} else if (e.keyCode == 32) {
|
||||
showButtons();
|
||||
$("#play").trigger("click");
|
||||
} else if (e.keyCode == 37) {
|
||||
showButtons();
|
||||
$("#previous").trigger("click");
|
||||
} else if (e.keyCode == 39) {
|
||||
showButtons();
|
||||
$("#next").trigger("click");
|
||||
} else if (e.keyCode == 187) {
|
||||
showButtons();
|
||||
!zoomedIn && $("#zoomin").trigger("click");
|
||||
} else if (e.keyCode == 189) {
|
||||
showButtons();
|
||||
zoomedIn && $("#zoomin").trigger("click");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
$layer.show().animate({
|
||||
opacity: 1
|
||||
}, 250);
|
||||
photo = i;
|
||||
return that;
|
||||
}
|
||||
that.remove = function() {
|
||||
$img.remove();
|
||||
return that;
|
||||
}
|
||||
that.show = function(i) {
|
||||
var $imgOld = $img,
|
||||
offset = $img.offset(),
|
||||
size = {
|
||||
width: $img.width(),
|
||||
height: $img.height()
|
||||
};
|
||||
$img = $("<img>")
|
||||
.addClass(zoomedIn ? "original" : "photo")
|
||||
.attr({
|
||||
src: photos[i].file.replace("/IMG", "/90/IMG"),
|
||||
})
|
||||
.css(zoomedIn ? $.extend(getOriginalCSS(i), {
|
||||
left: offset.left + "px",
|
||||
top: offset.top + "px"
|
||||
}) : getPhotoCSS(i))
|
||||
.css({
|
||||
opacity: 0
|
||||
})
|
||||
.appendTo($album)
|
||||
.animate({
|
||||
opacity: 1
|
||||
}, playInterval ? 500 : 250, function() {
|
||||
location.hash = [user, album, photos[i].file.substr(-8, 4)].join("/");
|
||||
$imgOld.remove();
|
||||
photo = i;
|
||||
if (zoomedIn) {
|
||||
if (photos[i].width / size.width == size.width && photos[i].height == size.height) {
|
||||
$("img.map")
|
||||
.attr({
|
||||
src: photos[photo].file.replace("/IMG", "/90/IMG"),
|
||||
});
|
||||
} else {
|
||||
$img.css({
|
||||
left: offset.left * (photos[i].width - windowWidth) / (size.width - windowWidth),
|
||||
top: offset.top * (photos[i].height - windowHeight) / (size.height - windowHeight)
|
||||
});
|
||||
$("div.map").remove();
|
||||
map = new Map().show();
|
||||
}
|
||||
}
|
||||
});
|
||||
spinner = new Spinner().start();
|
||||
var $img_ = $("<img>")
|
||||
.attr({
|
||||
src: photos[photo].file.replace("/IMG", "/720/IMG")
|
||||
})
|
||||
.load(function() {
|
||||
$img.attr({
|
||||
src: photos[photo].file.replace("/IMG", "/720/IMG")
|
||||
});
|
||||
if (zoomedIn) {
|
||||
$img_ = $("<img>")
|
||||
.attr({
|
||||
src: photos[photo].file
|
||||
})
|
||||
.load(function() {
|
||||
$img.attr({
|
||||
src: photos[photo].file
|
||||
});
|
||||
spinner.stop();
|
||||
});
|
||||
} else {
|
||||
spinner.stop();
|
||||
}
|
||||
});
|
||||
return that;
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
function Select(name, options, selected) {
|
||||
var that = this,
|
||||
$div = $("<div>")
|
||||
.addClass("select");
|
||||
$val = $("<div>")
|
||||
.html(name + ": " + selected)
|
||||
.appendTo($div);
|
||||
$select = $("<select>")
|
||||
.change(function() {
|
||||
var val = $select.val()
|
||||
$val.html(name + ": " + val);
|
||||
new Album(user, val).show();
|
||||
})
|
||||
.appendTo($div);
|
||||
$.each(options, function(i, option) {
|
||||
var $option = $("<option>")
|
||||
.html(option)
|
||||
.appendTo($select);
|
||||
option == selected && $option.attr({
|
||||
selected: "selected"
|
||||
});
|
||||
});
|
||||
that.show = function() {
|
||||
$("#left").append($div);
|
||||
return that;
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
function Spinner() {
|
||||
var that = this,
|
||||
$div = $("<div>")
|
||||
.addClass("spinner")
|
||||
.css({
|
||||
left: ((windowWidth - 16 - 24) / 2) + "px",
|
||||
top: ((windowHeight - 24) / 2) + "px",
|
||||
}),
|
||||
$img = $("<img>")
|
||||
.addClass("spinner")
|
||||
.attr({
|
||||
src: "png/symbolLoading.png"
|
||||
})
|
||||
.appendTo($div),
|
||||
deg = 0,
|
||||
interval;
|
||||
function update() {
|
||||
$img.css({
|
||||
MozTransform: "rotate(" + deg + "deg)",
|
||||
WebkitTransform: "rotate(" + deg + "deg)"
|
||||
});
|
||||
}
|
||||
that.start = function() {
|
||||
var spinner_ = $(".spinner");
|
||||
if (spinner_) {
|
||||
spinner_.remove();
|
||||
}
|
||||
deg = 0;
|
||||
$div.appendTo($album).animate({
|
||||
opacity: 1
|
||||
}, 250);
|
||||
interval = setInterval(function() {
|
||||
deg = (deg + 30) % 360;
|
||||
update();
|
||||
}, 83);
|
||||
return that;
|
||||
};
|
||||
that.stop = function() {
|
||||
$div.animate({
|
||||
opacity: 0
|
||||
}, 250, function() {
|
||||
$div.remove();
|
||||
clearTimeout(interval);
|
||||
deg = 0;
|
||||
});
|
||||
return that;
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
function Thumbnail(i) {
|
||||
var that = this,
|
||||
image = photos[i],
|
||||
width = image.width * 90 / image.height,
|
||||
marginLeft = 16 + Math.floor((135 - width) / 2),
|
||||
marginRight = 16 + Math.ceil((135 - width) / 2),
|
||||
$img = $("<img>")
|
||||
.addClass("thumbnail loading")
|
||||
.attr({
|
||||
id: image.file.substr(-8, 4),
|
||||
src: image.file.replace("/IMG", "/90/IMG"),
|
||||
})
|
||||
.css({
|
||||
width: width + "px",
|
||||
marginLeft: marginLeft + "px",
|
||||
marginRight: marginRight + "px"
|
||||
})
|
||||
.click(function() {
|
||||
new Photo(i).open();
|
||||
})
|
||||
.load(function() {
|
||||
$(this).removeClass("loading");
|
||||
});
|
||||
that.position = function() {
|
||||
var offset = $img.offset();
|
||||
return {
|
||||
left: offset.left + 4,
|
||||
top: offset.top + 4 - $body.scrollTop(),
|
||||
width: $img.width(),
|
||||
height: $img.height()
|
||||
};
|
||||
}
|
||||
that.show = function() {
|
||||
$img.appendTo($album);
|
||||
return that;
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
||||
$.getJSON("json/jpg.json", function(data) {
|
||||
json = data;
|
||||
$.each(data, function(username, albumnames) {
|
||||
users.push(username);
|
||||
albums[username] = [];
|
||||
$.each(albumnames, function(albumname, photos) {
|
||||
albums[username].push(albumname);
|
||||
});
|
||||
});
|
||||
new Select("User", users, user).show();
|
||||
new Select("Album", albums[user], album).show();
|
||||
new Input("About: Photos", function() {
|
||||
new Dialog("About: Photos", "2005-2010 Robert Luxemburg<br/><br/>Creative Commons Attribution Non-Commercial Share Alike 3.0").open();
|
||||
}).show();
|
||||
new Input("About: Software", function() {
|
||||
new Dialog("About: Software", "2010 Robert Luxemburg<br/><br/>GNU General Public License 3.0<br/><br/><a href=\"zip/jpg.zip\">Download</a> (0.1.0, 2010-05-05, 150 KB)").open();
|
||||
}).show();
|
||||
new Album(user, album).show();
|
||||
photoid && setTimeout(function() {
|
||||
$("#" + photoid).trigger("click")
|
||||
}, 500);
|
||||
//$body.append("<br clear=\"all\"/>");
|
||||
//$body.append("5DM2 - GPL V3 - <a href=\"5DM2.zip\">Download</a>");
|
||||
});
|
||||
});
|
||||
6240
js/jquery.js
vendored
Normal file
6240
js/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue