/* This file is part of Cyclos (www.cyclos.org). A project of the Social Trade Organisation (www.socialtrade.org). Cyclos is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Cyclos is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Cyclos; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package nl.strohalm.cyclos.taglibs; import java.io.IOException; import java.util.Collections; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; import nl.strohalm.cyclos.entities.customization.images.Image; import nl.strohalm.cyclos.entities.customization.images.OwneredImage; import nl.strohalm.cyclos.entities.settings.LocalSettings; import nl.strohalm.cyclos.services.settings.SettingsService; import nl.strohalm.cyclos.utils.MessageHelper; import nl.strohalm.cyclos.utils.SpringHelper; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; /** * Tag used to display and remove images * @author luis */ public class ImagesTag extends TagSupport { private static final long serialVersionUID = -2838185736271052294L; private boolean editable; private List<? extends OwneredImage> images; private boolean imageOnly; private String varName; private String style; @Override public int doEndTag() throws JspException { release(); return super.doEndTag(); } @Override public int doStartTag() throws JspException { final HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); final StringBuilder sb = new StringBuilder(); if (images == null) { images = Collections.emptyList(); } final LocalSettings localSettings = getLocalSettings(); // Get the nature and owner id of the images Image.Nature nature = null; Long ownerId = null; if (!images.isEmpty()) { final OwneredImage image = images.iterator().next(); nature = image.getNature(); ownerId = image.getOwner().getId(); } final int adjust = imageOnly ? 0 : 8; final int width = localSettings.getMaxThumbnailWidth() + adjust; final String rnd = System.currentTimeMillis() + "_" + RandomStringUtils.random(4, true, false); final String id = "img_" + rnd; sb.append("<div id='").append(id).append("' style='width:").append(width).append("px;").append(style == null ? "" : style).append("' class='imageContainerDiv ").append(imageOnly ? "" : "imageContainer").append("'>"); if (!imageOnly) { sb.append("<div class='thumbnailContainer'><table style='width:100%;border:none;padding:0px;margin:0px;'><tr><td style='text-align:center;vertical-align:middle;border:none;padding:0px;margin:0px;'>\n"); } sb.append("<img class='thumbnail' id='thumbnail_").append(rnd).append("' src='").append(request.getContextPath()).append("/systemImage?image=noPicture&thumbnail=true'/>"); if (!imageOnly) { sb.append("</td></tr></table></div>"); if (images.size() > 1) { sb.append("<div class='imageControls' id='imageControls_").append(rnd).append("'><table cellpadding='0' cellspacing='0' border='0' width='100%'><tr>"); sb.append("<td style='padding:0px' class='imageControlPrevious' id='previous_").append(rnd).append("' onclick='this.container.previousImage()' align='center' width='10'><img style='cursor:pointer;cursor:hand;' src=\"" + request.getContextPath() + "/pages/images/previous.gif\" border=\"0\"></td>"); sb.append("<td style='padding:0px' class='imageIndex' id='index_").append(rnd).append("' nowrap='nowrap' align='center'>1 / ").append(images.size()).append("</td>"); sb.append("<td style='padding:0px' class='imageControlNext' id='next_").append(rnd).append("' onclick='this.container.nextImage()' align='center' width=\'10\'><img style='cursor:pointer;cursor:hand;' src=\"" + request.getContextPath() + "/pages/images/next.gif\" border=\"0\"></td>"); sb.append("</tr></table></div>\n"); } if (editable && !images.isEmpty()) { final MessageHelper messageHelper = SpringHelper.bean(pageContext.getServletContext(), MessageHelper.class); sb.append("<div class='imageDetails' id='imageDetails_").append(rnd).append("' style='cursor:pointer;cursor:hand' onclick='this.container.details()'><a>"); sb.append(messageHelper.message("image.details")); sb.append("</a></div>\n"); sb.append("<div class='imageRemove' id='imageRemove_").append(rnd).append("' style='cursor:pointer;cursor:hand' onclick='this.container.removeImage()'><a>"); sb.append(messageHelper.message("image.remove")); sb.append("</a></div>\n"); } } sb.append("</div>\n"); sb.append("<script>\n"); final String varName = StringUtils.isEmpty(this.varName) ? id : this.varName; sb.append(String.format("var %s = new ImageContainer($('%s'), '%s', '%s');\n", varName, id, nature, ownerId)); // Add the image descriptors for (final OwneredImage image : images) { final String caption = StringEscapeUtils.escapeHtml(StringUtils.trimToEmpty(image.getCaption())); final String url = StringEscapeUtils.escapeHtml(request.getContextPath() + "/thumbnail?id=" + image.getId()); sb.append(varName).append(String.format(".imageDescriptors.push(new ImageDescriptor('%s', '%s', '%s'));\n", image.getId(), StringEscapeUtils.escapeJavaScript(caption), StringEscapeUtils.escapeJavaScript(url))); } // Set the references to other elements sb.append(varName).append(".appendElement('index', 'index_").append(rnd).append("');\n"); sb.append(varName).append(".appendElement('thumbnail', 'thumbnail_").append(rnd).append("');\n"); sb.append(varName).append(".appendElement('controls', 'imageControls_").append(rnd).append("');\n"); sb.append(varName).append(".appendElement('previous', 'previous_").append(rnd).append("');\n"); sb.append(varName).append(".appendElement('next', 'next_").append(rnd).append("');\n"); sb.append(varName).append(".appendElement('imageRemove', 'imageRemove_").append(rnd).append("');\n"); sb.append(varName).append(".appendElement('imageDetails', 'imageDetails_").append(rnd).append("');\n"); sb.append(varName).append(".currentImage = 0;\n"); sb.append(varName).append(".updateImage();\n"); sb.append("</script>\n"); try { pageContext.getOut().print(sb.toString()); } catch (final IOException e) { throw new JspException(e); } return EVAL_PAGE; } public List<? extends OwneredImage> getImages() { return images; } public String getVarName() { return varName; } public boolean isEditable() { return editable; } public boolean isImageOnly() { return imageOnly; } @Override public void release() { super.release(); images = null; varName = null; imageOnly = false; editable = false; style = null; } public void setEditable(final boolean editable) { this.editable = editable; } public void setImageOnly(final boolean imageOnly) { this.imageOnly = imageOnly; } public void setImages(final List<? extends OwneredImage> images) { this.images = images; } public void setStyle(final String style) { this.style = style; } public void setVarName(final String varName) { this.varName = varName; } private LocalSettings getLocalSettings() { final SettingsService settingsService = SpringHelper.bean(pageContext.getServletContext(), SettingsService.class); final LocalSettings settings = settingsService.getLocalSettings(); return settings; } }