diff --git a/gucci/assets/about-gucci-background.jpg b/gucci/assets/about-gucci-background.jpg deleted file mode 100644 index 9efe1af..0000000 Binary files a/gucci/assets/about-gucci-background.jpg and /dev/null differ diff --git a/gucci/assets/album-ext.js b/gucci/assets/album-ext.js index 34abc5f..c166203 100644 --- a/gucci/assets/album-ext.js +++ b/gucci/assets/album-ext.js @@ -67,17 +67,19 @@ var Loader = { _assets: $H({}), _checkInterval: null, _options: {}, + _update: function() { + var allLoaded = true; Loader._assets.each(function(a) { - if(!a[1].complete && a[1].image.complete) { + if (!a[1].complete && a[1].image.complete) { a[1].complete = true; a[1].completed_at = new Date().getTime(); if(a[1].options.onComplete) { a[1].options.onComplete(a[0]); } } - if(!a[1].complete && !a[1].image.complete) { + if (!a[1].complete && !a[1].image.complete) { allLoaded = false; } }); @@ -139,7 +141,7 @@ var Loader = { }, isQueued: function(url) { - return !!(Loader._assets.get(url)); + return Loader._assets.get(url); }, isLoaded: function(url) { @@ -230,7 +232,7 @@ Effect.HScrollToElement = function(element, direction) { var delta = -(offset - elementMiddle) - clickOffset; new Effect.HScroll(delta); } - +/* Effect.MoveRight = Class.create(); Object.extend(Object.extend(Effect.MoveRight.prototype, Effect.Base.prototype), { @@ -254,3 +256,4 @@ Object.extend(Object.extend(Effect.MoveRight.prototype, Effect.Base.prototype), }); } }); +*/ diff --git a/gucci/assets/album.js b/gucci/assets/album.js index c1e82e7..96d1627 100644 --- a/gucci/assets/album.js +++ b/gucci/assets/album.js @@ -1,7 +1,7 @@ var Album = { pictures: [], - queue: { position: 'end', scope: 'shop' }, + queue: { position: 'end', scope: 'album' }, cubic: function(pos) { pos /= 0.5; @@ -59,7 +59,7 @@ var Album = { imgtags.each(function(img, index) { var container = img.parentNode; var picturebox = container.parentNode; - var darkener = img.next(); + // var darkener = img.next(); var picture = _pictures[container.id.substr(3)]; $(img).setStyle({ width: picture.width + 'px', height: picture.height + 'px' }); @@ -67,29 +67,6 @@ var Album = { $(picturebox).setStyle({ width: picture.width + 'px' }); totalWidth += picture.width; pictureCount += 1; - - /* - if (!container.hasClassName('highlight') && highlight.include(picture)) { - new Effect.Opacity(container, { from: 1, to: 0, afterFinish:function() { - container.setOpacity(1); - container.addClassName('highlight'); - darkener.setOpacity(0.001); - }}); - } else if (container.hasClassName('highlight') && !highlight.include(picture)) { - container.setOpacity(0); - container.removeClassName('highlight'); - - new Effect.Opacity(container,{ from: 0, to: 1.0 }); - new Effect.Opacity(darkener, { from: 0, to: 0.3 }); - } - if (picture != null) { - Album.thumbs.push({ - id: picture.style, - stylegroup: picture.id, - thumburl: picture.thumburl - }); - } - */ }); totalWidth += (pictureCount - 1) * 65; @@ -125,8 +102,8 @@ var Album = { if ((x0 >= 0 && x0 < w) || (x1 >=0 && x1 < w)) { visibles.push(img); } else { - img.src = 'assets/empty.gif'; Loader.remove(picture.url); + img.src = 'assets/empty.gif'; } }); @@ -135,7 +112,6 @@ var Album = { var id = img.parentNode.id; var picture = _pictures[id.substr(3)]; - // alert(picture.url); if (img.src == picture.url) return; @@ -143,14 +119,15 @@ var Album = { if (Loader.isQueued(imageObj)) return; - // alert('src: ' + img.src + '\nurl: ' + picture.url + '\nmatch: ' + img.src.match('assets/empty\.gif$') + '\nloader: ' + Loader.isQueued(imageObj)); + // alert('Loading: ' + imageObj + '\nsrc: ' + img.src + '\nurl: ' + picture.url + '\nmatch: ' + img.src.match('assets/empty\.gif$') + '\nloader: ' + Loader.isQueued(imageObj)); // $(img).setStyle({ position: 'relative', left: ('-' + picture.width + 'px') }); Loader.cacheOrLoad(imageObj, { onComplete: function(obj) { // $(img).setStyle({ position: 'relative', left: '0px'}).setOpacity(0); - $(img).setOpacity(0); + img.setOpacity(0); + // alert(obj); img.src = obj; new Effect.Opacity(img, { from: 0, to: 1, delay: 0.2, transition: Album.cubic, duration: 0.8 }); }}); diff --git a/gucci/assets/background-ie.gif b/gucci/assets/background-ie.gif deleted file mode 100644 index 2e00c1c..0000000 Binary files a/gucci/assets/background-ie.gif and /dev/null differ diff --git a/gucci/assets/gucci-logo.gif b/gucci/assets/gucci-logo.gif deleted file mode 100644 index efc39fd..0000000 Binary files a/gucci/assets/gucci-logo.gif and /dev/null differ diff --git a/gucci/assets/hp_box.jpg b/gucci/assets/hp_box.jpg deleted file mode 100644 index 06da2e2..0000000 Binary files a/gucci/assets/hp_box.jpg and /dev/null differ diff --git a/gucci/assets/hp_cr08_clutch.jpg b/gucci/assets/hp_cr08_clutch.jpg deleted file mode 100644 index f8a1940..0000000 Binary files a/gucci/assets/hp_cr08_clutch.jpg and /dev/null differ diff --git a/gucci/assets/hp_ss08_shoe_catalog.jpg b/gucci/assets/hp_ss08_shoe_catalog.jpg deleted file mode 100644 index 0a61120..0000000 Binary files a/gucci/assets/hp_ss08_shoe_catalog.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_10_thumb.jpg b/gucci/assets/ss08_rtwm_10_thumb.jpg deleted file mode 100644 index e711d0e..0000000 Binary files a/gucci/assets/ss08_rtwm_10_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_11_thumb.jpg b/gucci/assets/ss08_rtwm_11_thumb.jpg deleted file mode 100644 index 7366818..0000000 Binary files a/gucci/assets/ss08_rtwm_11_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_12_thumb.jpg b/gucci/assets/ss08_rtwm_12_thumb.jpg deleted file mode 100644 index 6f4e29e..0000000 Binary files a/gucci/assets/ss08_rtwm_12_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_13_thumb.jpg b/gucci/assets/ss08_rtwm_13_thumb.jpg deleted file mode 100644 index cc1b13f..0000000 Binary files a/gucci/assets/ss08_rtwm_13_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_14_thumb.jpg b/gucci/assets/ss08_rtwm_14_thumb.jpg deleted file mode 100644 index 3988e48..0000000 Binary files a/gucci/assets/ss08_rtwm_14_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_15_thumb.jpg b/gucci/assets/ss08_rtwm_15_thumb.jpg deleted file mode 100644 index 68e3343..0000000 Binary files a/gucci/assets/ss08_rtwm_15_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_16_thumb.jpg b/gucci/assets/ss08_rtwm_16_thumb.jpg deleted file mode 100644 index 130052f..0000000 Binary files a/gucci/assets/ss08_rtwm_16_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_17_thumb.jpg b/gucci/assets/ss08_rtwm_17_thumb.jpg deleted file mode 100644 index ea0de45..0000000 Binary files a/gucci/assets/ss08_rtwm_17_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_18_thumb.jpg b/gucci/assets/ss08_rtwm_18_thumb.jpg deleted file mode 100644 index 0b48386..0000000 Binary files a/gucci/assets/ss08_rtwm_18_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_19_thumb.jpg b/gucci/assets/ss08_rtwm_19_thumb.jpg deleted file mode 100644 index 1c9487e..0000000 Binary files a/gucci/assets/ss08_rtwm_19_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_1_thumb.jpg b/gucci/assets/ss08_rtwm_1_thumb.jpg deleted file mode 100644 index e0e3dff..0000000 Binary files a/gucci/assets/ss08_rtwm_1_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_20_thumb.jpg b/gucci/assets/ss08_rtwm_20_thumb.jpg deleted file mode 100644 index 2de915e..0000000 Binary files a/gucci/assets/ss08_rtwm_20_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_21_thumb.jpg b/gucci/assets/ss08_rtwm_21_thumb.jpg deleted file mode 100644 index 234252d..0000000 Binary files a/gucci/assets/ss08_rtwm_21_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_22_thumb.jpg b/gucci/assets/ss08_rtwm_22_thumb.jpg deleted file mode 100644 index db41cc3..0000000 Binary files a/gucci/assets/ss08_rtwm_22_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_23_thumb.jpg b/gucci/assets/ss08_rtwm_23_thumb.jpg deleted file mode 100644 index 2874ff0..0000000 Binary files a/gucci/assets/ss08_rtwm_23_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_24_thumb.jpg b/gucci/assets/ss08_rtwm_24_thumb.jpg deleted file mode 100644 index f1a1aac..0000000 Binary files a/gucci/assets/ss08_rtwm_24_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_25_thumb.jpg b/gucci/assets/ss08_rtwm_25_thumb.jpg deleted file mode 100644 index 158c29f..0000000 Binary files a/gucci/assets/ss08_rtwm_25_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_26_thumb.jpg b/gucci/assets/ss08_rtwm_26_thumb.jpg deleted file mode 100644 index 1f795ee..0000000 Binary files a/gucci/assets/ss08_rtwm_26_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_27_thumb.jpg b/gucci/assets/ss08_rtwm_27_thumb.jpg deleted file mode 100644 index 2e20315..0000000 Binary files a/gucci/assets/ss08_rtwm_27_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_28_thumb.jpg b/gucci/assets/ss08_rtwm_28_thumb.jpg deleted file mode 100644 index d205d81..0000000 Binary files a/gucci/assets/ss08_rtwm_28_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_29_thumb.jpg b/gucci/assets/ss08_rtwm_29_thumb.jpg deleted file mode 100644 index b651d2c..0000000 Binary files a/gucci/assets/ss08_rtwm_29_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_2_thumb.jpg b/gucci/assets/ss08_rtwm_2_thumb.jpg deleted file mode 100644 index 75030c9..0000000 Binary files a/gucci/assets/ss08_rtwm_2_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_30_thumb.jpg b/gucci/assets/ss08_rtwm_30_thumb.jpg deleted file mode 100644 index da8f220..0000000 Binary files a/gucci/assets/ss08_rtwm_30_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_31_thumb.jpg b/gucci/assets/ss08_rtwm_31_thumb.jpg deleted file mode 100644 index d68f9a4..0000000 Binary files a/gucci/assets/ss08_rtwm_31_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_32_thumb.jpg b/gucci/assets/ss08_rtwm_32_thumb.jpg deleted file mode 100644 index cc044e9..0000000 Binary files a/gucci/assets/ss08_rtwm_32_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_33_thumb.jpg b/gucci/assets/ss08_rtwm_33_thumb.jpg deleted file mode 100644 index 142b226..0000000 Binary files a/gucci/assets/ss08_rtwm_33_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_34_thumb.jpg b/gucci/assets/ss08_rtwm_34_thumb.jpg deleted file mode 100644 index a5af894..0000000 Binary files a/gucci/assets/ss08_rtwm_34_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_35_thumb.jpg b/gucci/assets/ss08_rtwm_35_thumb.jpg deleted file mode 100644 index 5d8fb3d..0000000 Binary files a/gucci/assets/ss08_rtwm_35_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_36_thumb.jpg b/gucci/assets/ss08_rtwm_36_thumb.jpg deleted file mode 100644 index 8e106ce..0000000 Binary files a/gucci/assets/ss08_rtwm_36_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_37_thumb.jpg b/gucci/assets/ss08_rtwm_37_thumb.jpg deleted file mode 100644 index 3a17a9f..0000000 Binary files a/gucci/assets/ss08_rtwm_37_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_38_thumb.jpg b/gucci/assets/ss08_rtwm_38_thumb.jpg deleted file mode 100644 index f63257b..0000000 Binary files a/gucci/assets/ss08_rtwm_38_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_39_thumb.jpg b/gucci/assets/ss08_rtwm_39_thumb.jpg deleted file mode 100644 index a1c4032..0000000 Binary files a/gucci/assets/ss08_rtwm_39_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_3_thumb.jpg b/gucci/assets/ss08_rtwm_3_thumb.jpg deleted file mode 100644 index 9154288..0000000 Binary files a/gucci/assets/ss08_rtwm_3_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_40_thumb.jpg b/gucci/assets/ss08_rtwm_40_thumb.jpg deleted file mode 100644 index e68e3a4..0000000 Binary files a/gucci/assets/ss08_rtwm_40_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_41_thumb.jpg b/gucci/assets/ss08_rtwm_41_thumb.jpg deleted file mode 100644 index b491f9a..0000000 Binary files a/gucci/assets/ss08_rtwm_41_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_42_thumb.jpg b/gucci/assets/ss08_rtwm_42_thumb.jpg deleted file mode 100644 index 312eeb4..0000000 Binary files a/gucci/assets/ss08_rtwm_42_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_43_thumb.jpg b/gucci/assets/ss08_rtwm_43_thumb.jpg deleted file mode 100644 index 8cc0746..0000000 Binary files a/gucci/assets/ss08_rtwm_43_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_44_thumb.jpg b/gucci/assets/ss08_rtwm_44_thumb.jpg deleted file mode 100644 index 5d5b177..0000000 Binary files a/gucci/assets/ss08_rtwm_44_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_4_thumb.jpg b/gucci/assets/ss08_rtwm_4_thumb.jpg deleted file mode 100644 index 8f641ff..0000000 Binary files a/gucci/assets/ss08_rtwm_4_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_5_thumb.jpg b/gucci/assets/ss08_rtwm_5_thumb.jpg deleted file mode 100644 index 204ab31..0000000 Binary files a/gucci/assets/ss08_rtwm_5_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_6_thumb.jpg b/gucci/assets/ss08_rtwm_6_thumb.jpg deleted file mode 100644 index db594bf..0000000 Binary files a/gucci/assets/ss08_rtwm_6_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_7_thumb.jpg b/gucci/assets/ss08_rtwm_7_thumb.jpg deleted file mode 100644 index e340e68..0000000 Binary files a/gucci/assets/ss08_rtwm_7_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_8_thumb.jpg b/gucci/assets/ss08_rtwm_8_thumb.jpg deleted file mode 100644 index 52cbeb6..0000000 Binary files a/gucci/assets/ss08_rtwm_8_thumb.jpg and /dev/null differ diff --git a/gucci/assets/ss08_rtwm_9_thumb.jpg b/gucci/assets/ss08_rtwm_9_thumb.jpg deleted file mode 100644 index 072baff..0000000 Binary files a/gucci/assets/ss08_rtwm_9_thumb.jpg and /dev/null differ diff --git a/src/ShardulFilter.java b/src/ShardulFilter.java new file mode 100644 index 0000000..2299678 --- /dev/null +++ b/src/ShardulFilter.java @@ -0,0 +1,86 @@ +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URI; +import java.util.Date; +import java.util.Enumeration; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +public class ShardulFilter implements Filter { + + public void doFilter(ServletRequest req0, ServletResponse res0, FilterChain chain) throws IOException, + ServletException { + + HttpServletRequest req = (HttpServletRequest)req0; + HttpServletResponse res = (HttpServletResponse)res0; + String ref = req.getHeader("Referer"); + if (ref != null) { + try { + URI refUri = new URI(ref); + String host = refUri.getHost(); + if (host != null && host.toLowerCase().endsWith(".wordpress.com")) { + logRequest("redirect", req, null); + res.sendRedirect("http://www.forkalsrud.org/stalker.jpg"); + return; + } + } catch (Exception e) { + logRequest("error", req, e); + } + } + chain.doFilter(req, res); + } + + private void logRequest(String string, HttpServletRequest req, Exception e) { + + try { + File logfile = new File(System.getProperty("user.home"), "stalker.log"); + FileWriter fw = new FileWriter(logfile, true); + fw.write("--------------------\n"); + fw.write("" + new Date() + "\n"); + fw.write("IP: " + req.getRemoteAddr() + " " + req.getRemoteHost() + " " + req.getRequestURL().toString() + "\n"); + Enumeration enm = req.getParameterNames(); + while (enm.hasMoreElements()) { + String param = (String)enm.nextElement(); + String[] val = req.getParameterValues(param); + for (String s : val) { + fw.write("param " + param + ": " + s + "\n"); + } + } + fw.write("\n"); + enm = req.getHeaderNames(); + while (enm.hasMoreElements()) { + String header = (String)enm.nextElement(); + String val = req.getHeader(header); + fw.write(header + ": " + val + "\n"); + } + fw.write("\n"); + if (e != null) { + e.printStackTrace(new PrintWriter(fw, true)); + } + fw.write("\n"); + fw.flush(); + fw.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + + public void init(FilterConfig arg0) throws ServletException { + // noop + } + + public void destroy() { + // noop + } + +} diff --git a/src/org/forkalsrud/album/exif/EntryDao.java b/src/org/forkalsrud/album/exif/EntryDao.java index c69e14a..a02e3b8 100644 --- a/src/org/forkalsrud/album/exif/EntryDao.java +++ b/src/org/forkalsrud/album/exif/EntryDao.java @@ -107,6 +107,18 @@ public class EntryDao { } + public Entry readFile(File file) throws FileNotFoundException, IOException, JpegProcessingException, MetadataException, ParseException { + + List dir = read(file.getParentFile()); + String name = file.getName(); + for (Entry e : dir) { + if (name.equals(e.name)) { + return e; + } + } + return null; + } + void generateEntries(File directory, Properties cachedProps) throws JpegProcessingException, MetadataException, FileNotFoundException, IOException { File[] files = directory.listFiles(new FileFilter() { diff --git a/src/org/forkalsrud/album/web/AlbumServlet.java b/src/org/forkalsrud/album/web/AlbumServlet.java index 5885b73..a6882a0 100644 --- a/src/org/forkalsrud/album/web/AlbumServlet.java +++ b/src/org/forkalsrud/album/web/AlbumServlet.java @@ -45,24 +45,13 @@ public class AlbumServlet public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { - /* - System.out.println("pathInfo: " + req.getPathInfo()); - System.out.println("pathXlat: " + req.getPathTranslated()); - System.out.println("queryString: " + req.getQueryString()); - System.out.println("requestUri: " + req.getRequestURI()); - System.out.println("servletPath: " + req.getServletPath()); -*/ - -/* useless - Set paths = getServletContext().getResourcePaths(req.getPathTranslated()); - for (Object path2 : paths) { - System.out.println(" " + String.valueOf(path2)); - } - System.out.println(); -*/ String path = req.getPathTranslated(); -// System.out.println("file: " + path); + String page = null; + if (path.endsWith(".photo")) { + path = path.substring(0, path.length() - ".photo".length()); + page = "photo"; + } File file = new File(path); if (file == null) { res.setStatus(HttpServletResponse.SC_NOT_FOUND); @@ -100,6 +89,16 @@ public class AlbumServlet } catch (Exception e) { throw new RuntimeException("sadness", e); } + } else if ("photo".equals(page)) { + + try { + Entry e = dao.readFile(file); + req.setAttribute("entry", e); + RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/velocity/photo.vm"); + rd.forward(req, res); + } catch (Exception e) { + throw new RuntimeException("sadness", e); + } } else { res.setStatus(HttpServletResponse.SC_NOT_FOUND); } diff --git a/webapp/WEB-INF/velocity/directory.vm b/webapp/WEB-INF/velocity/directory.vm index 42851f2..79b7ad5 100644 --- a/webapp/WEB-INF/velocity/directory.vm +++ b/webapp/WEB-INF/velocity/directory.vm @@ -11,7 +11,6 @@ font-family: "Lucida Grande", Arial, sans-serif; color: #6d6d6d; background: #acc95f; - width: 600px; margin: 10px auto; text-align: center; } @@ -42,7 +41,7 @@ #set($dim = $entry.size.scaled($thmb))
$entry.name
-
+
$!entry.caption
#end diff --git a/webapp/WEB-INF/velocity/photo.vm b/webapp/WEB-INF/velocity/photo.vm new file mode 100644 index 0000000..fc2dd9f --- /dev/null +++ b/webapp/WEB-INF/velocity/photo.vm @@ -0,0 +1,46 @@ + + + + + + $entry.name + + + + +#set($thmb = 480) +#set($dim = $entry.size.scaled($thmb)) +
+ $entry.name
+
+ $!entry.caption +
+ + +