www/common/annotations/annotate.jsp

Code
Comments
Other
Rev Date Author Line
903 08 Jul 05 nicklas 1 <%-- $Id$
903 08 Jul 05 nicklas 2   ------------------------------------------------------------------
3675 16 Aug 07 jari 3   Copyright (C) 2005 Nicklas Nordborg
5425 23 Sep 10 nicklas 4   Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg
3675 16 Aug 07 jari 5   Copyright (C) 2007 Nicklas Nordborg
903 08 Jul 05 nicklas 6
2304 22 May 06 jari 7   This file is part of BASE - BioArray Software Environment.
2304 22 May 06 jari 8   Available at http://base.thep.lu.se/
903 08 Jul 05 nicklas 9
903 08 Jul 05 nicklas 10   BASE is free software; you can redistribute it and/or
903 08 Jul 05 nicklas 11   modify it under the terms of the GNU General Public License
4476 05 Sep 08 jari 12   as published by the Free Software Foundation; either version 3
903 08 Jul 05 nicklas 13   of the License, or (at your option) any later version.
903 08 Jul 05 nicklas 14
903 08 Jul 05 nicklas 15   BASE is distributed in the hope that it will be useful,
903 08 Jul 05 nicklas 16   but WITHOUT ANY WARRANTY; without even the implied warranty of
903 08 Jul 05 nicklas 17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
903 08 Jul 05 nicklas 18   GNU General Public License for more details.
903 08 Jul 05 nicklas 19
903 08 Jul 05 nicklas 20   You should have received a copy of the GNU General Public License
4510 11 Sep 08 jari 21   along with BASE. If not, see <http://www.gnu.org/licenses/>.
903 08 Jul 05 nicklas 22   ------------------------------------------------------------------
1652 22 Nov 05 nicklas 23   
903 08 Jul 05 nicklas 24   @author Nicklas
903 08 Jul 05 nicklas 25   @version 2.0
903 08 Jul 05 nicklas 26 --%>
5426 24 Sep 10 nicklas 27 <%@ page pageEncoding="UTF-8" session="false"
903 08 Jul 05 nicklas 28   import="net.sf.basedb.core.SessionControl"
903 08 Jul 05 nicklas 29   import="net.sf.basedb.core.DbControl"
903 08 Jul 05 nicklas 30   import="net.sf.basedb.core.Item"
936 14 Jul 05 nicklas 31   import="net.sf.basedb.core.Type"
913 12 Jul 05 nicklas 32   import="net.sf.basedb.core.BasicItem"
913 12 Jul 05 nicklas 33   import="net.sf.basedb.core.Permission"
903 08 Jul 05 nicklas 34   import="net.sf.basedb.core.Annotatable"
2452 30 Jun 06 nicklas 35   import="net.sf.basedb.core.Nameable"
2875 08 Nov 06 nicklas 36   import="net.sf.basedb.core.Protocol"
8083 20 Oct 22 nicklas 37   import="net.sf.basedb.core.Project"
5644 26 May 11 nicklas 38   import="net.sf.basedb.core.Subtypable"
5644 26 May 11 nicklas 39   import="net.sf.basedb.core.ItemSubtype"
6319 09 Sep 13 nicklas 40   import="net.sf.basedb.core.BioPlateType"
6319 09 Sep 13 nicklas 41   import="net.sf.basedb.core.BioPlate"
7587 06 Feb 19 nicklas 42   import="net.sf.basedb.core.RawBioAssay"
7587 06 Feb 19 nicklas 43   import="net.sf.basedb.core.RawDataType"
7587 06 Feb 19 nicklas 44   import="net.sf.basedb.core.RawDataTypes"
903 08 Jul 05 nicklas 45   import="net.sf.basedb.core.AnnotationSet"
903 08 Jul 05 nicklas 46   import="net.sf.basedb.core.Annotation"
4547 26 Sep 08 nicklas 47   import="net.sf.basedb.core.Unit"
4547 26 Sep 08 nicklas 48   import="net.sf.basedb.core.Quantity"
3979 19 Nov 07 nicklas 49   import="net.sf.basedb.core.AnnotatableProxy"
1418 07 Oct 05 nicklas 50   import="net.sf.basedb.core.ItemQuery"
945 15 Jul 05 nicklas 51   import="net.sf.basedb.core.Include"
1418 07 Oct 05 nicklas 52   import="net.sf.basedb.core.ItemResultList"
903 08 Jul 05 nicklas 53   import="net.sf.basedb.core.AnnotationType"
2518 14 Aug 06 nicklas 54   import="net.sf.basedb.core.AnnotationTypeCategory"
2875 08 Nov 06 nicklas 55   import="net.sf.basedb.core.PermissionDeniedException"
2518 14 Aug 06 nicklas 56   import="net.sf.basedb.core.query.Expressions"
2518 14 Aug 06 nicklas 57   import="net.sf.basedb.core.query.Restrictions"
2518 14 Aug 06 nicklas 58   import="net.sf.basedb.core.query.Hql"
903 08 Jul 05 nicklas 59   import="net.sf.basedb.core.query.Orders"
2518 14 Aug 06 nicklas 60   import="net.sf.basedb.util.NameableComparator"
903 08 Jul 05 nicklas 61   import="net.sf.basedb.clients.web.Base"
903 08 Jul 05 nicklas 62   import="net.sf.basedb.clients.web.util.HTML"
2942 22 Nov 06 nicklas 63   import="net.sf.basedb.util.formatter.Formatter"
2942 22 Nov 06 nicklas 64   import="net.sf.basedb.clients.web.formatter.FormatterFactory"
2942 22 Nov 06 nicklas 65   import="net.sf.basedb.clients.web.formatter.FormatterSettings"
6947 08 Sep 15 nicklas 66   import="net.sf.basedb.clients.web.AnnotationUtil"
2753 20 Oct 06 nicklas 67   import="net.sf.basedb.util.Values"
6938 19 Aug 15 nicklas 68   import="org.json.simple.JSONObject"
6938 19 Aug 15 nicklas 69   import="org.json.simple.JSONArray"
2875 08 Nov 06 nicklas 70   import="java.util.ArrayList"
903 08 Jul 05 nicklas 71   import="java.util.List"
910 11 Jul 05 nicklas 72   import="java.util.Date"
2518 14 Aug 06 nicklas 73   import="java.util.Set"
2875 08 Nov 06 nicklas 74   import="java.util.HashSet"
2518 14 Aug 06 nicklas 75   import="java.util.TreeSet"
5074 24 Aug 09 nicklas 76   import="java.util.Map"
5074 24 Aug 09 nicklas 77   import="java.util.HashMap"
903 08 Jul 05 nicklas 78 %>
903 08 Jul 05 nicklas 79 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
6945 04 Sep 15 nicklas 80 <%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
6946 07 Sep 15 nicklas 81 <%@ taglib prefix="m" uri="/WEB-INF/menu.tld" %>
903 08 Jul 05 nicklas 82 <%
903 08 Jul 05 nicklas 83 final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
903 08 Jul 05 nicklas 84 final String ID = sc.getId();
1985 14 Feb 06 nicklas 85 final float scale = Base.getScale(sc);
903 08 Jul 05 nicklas 86 final Item itemType = Item.valueOf(request.getParameter("item_type"));
903 08 Jul 05 nicklas 87 final int itemId = Values.getInt(request.getParameter("item_id"));
8083 20 Oct 22 nicklas 88 final int projectId = Values.getInt(request.getParameter("project_id"), -1);
2875 08 Nov 06 nicklas 89 final int protocolId = Values.getInt(request.getParameter("protocol_id"), -1);
5644 26 May 11 nicklas 90 final int subtypeId = Values.getInt(request.getParameter("subtype_id"), -1);
6938 19 Aug 15 nicklas 91 final int annotationId = Values.getInt(request.getParameter("annotation_id"));
6938 19 Aug 15 nicklas 92 int annotationTypeId = Values.getInt(request.getParameter("annotationtype_id"));
2452 30 Jun 06 nicklas 93 final boolean standalone = Values.getBoolean(request.getParameter("standalone"));
903 08 Jul 05 nicklas 94
6947 08 Sep 15 nicklas 95 // Parent items may have been submitted by caller
6947 08 Sep 15 nicklas 96 // Each parameter is ITEMTYPE:ID:ID:...
6947 08 Sep 15 nicklas 97 String[] parents = request.getParameterValues("parents");
6947 08 Sep 15 nicklas 98
7954 12 May 21 nicklas 99 final DbControl dc = sc.newDbControl(":Edit annotations");
903 08 Jul 05 nicklas 100 try
903 08 Jul 05 nicklas 101 {
6202 12 Nov 12 nicklas 102   // Date and time formats
2942 22 Nov 06 nicklas 103   String dateFormat = FormatterSettings.getDateFormat(sc);
2942 22 Nov 06 nicklas 104   String htmlDateFormat = HTML.encodeTags(dateFormat);
5423 23 Sep 10 nicklas 105   String dateTimeFormat = FormatterSettings.getDateTimeFormat(sc);
5423 23 Sep 10 nicklas 106   String htmlDateTimeFormat = HTML.encodeTags(dateTimeFormat);
5423 23 Sep 10 nicklas 107   
6938 19 Aug 15 nicklas 108   Annotatable item = null;
6938 19 Aug 15 nicklas 109   
6938 19 Aug 15 nicklas 110   if (annotationId != 0)
6938 19 Aug 15 nicklas 111   {
6938 19 Aug 15 nicklas 112     Annotation a = Annotation.getById(dc, annotationId);
6938 19 Aug 15 nicklas 113     item = a.getAnnotationSet().getItem();
6938 19 Aug 15 nicklas 114     annotationTypeId = a.getAnnotationType().getId();
6938 19 Aug 15 nicklas 115   }
6938 19 Aug 15 nicklas 116   else if (itemId != 0)
6938 19 Aug 15 nicklas 117   {
6938 19 Aug 15 nicklas 118     item = (Annotatable)itemType.getById(dc, itemId);
6938 19 Aug 15 nicklas 119   }
7213 19 Oct 16 nicklas 120   final boolean annotatePermission = item == null ? true : item.hasPermission(Permission.RESTRICTED_WRITE);
6938 19 Aug 15 nicklas 121   
6202 12 Nov 12 nicklas 122   // Load the current item and it's protocol
6202 12 Nov 12 nicklas 123   // NOTE! User may have selected a different protocol in the form than what is
6202 12 Nov 12 nicklas 124   // currently saved so if a protocol_id is sent in the request we use that
2875 08 Nov 06 nicklas 125   Protocol protocol = null;
2875 08 Nov 06 nicklas 126   boolean readProtocol = true;
2875 08 Nov 06 nicklas 127   try
2875 08 Nov 06 nicklas 128   {
2875 08 Nov 06 nicklas 129     if (protocolId == - 1 && item != null)
2875 08 Nov 06 nicklas 130     {
2875 08 Nov 06 nicklas 131       protocol = item.getProtocol();
2875 08 Nov 06 nicklas 132     }
2875 08 Nov 06 nicklas 133     else if (protocolId > 0)
2875 08 Nov 06 nicklas 134     {
2875 08 Nov 06 nicklas 135       protocol = Protocol.getById(dc, protocolId);
2875 08 Nov 06 nicklas 136     }
2875 08 Nov 06 nicklas 137   }
2875 08 Nov 06 nicklas 138   catch (PermissionDeniedException ex)
2875 08 Nov 06 nicklas 139   {
2875 08 Nov 06 nicklas 140     readProtocol = false;
2875 08 Nov 06 nicklas 141   }
6202 12 Nov 12 nicklas 142   
8083 20 Oct 22 nicklas 143   // Load a project if it has been specified
8083 20 Oct 22 nicklas 144   Project project = null;
8083 20 Oct 22 nicklas 145   boolean readProject = true;
8083 20 Oct 22 nicklas 146   try
8083 20 Oct 22 nicklas 147   {
8083 20 Oct 22 nicklas 148     if (projectId > 0) project = Project.getById(dc, projectId);
8083 20 Oct 22 nicklas 149   }
8083 20 Oct 22 nicklas 150   catch (PermissionDeniedException ex)
8083 20 Oct 22 nicklas 151   {
8083 20 Oct 22 nicklas 152     readProject = false;
8083 20 Oct 22 nicklas 153   }
8083 20 Oct 22 nicklas 154   
6202 12 Nov 12 nicklas 155   // Load the current subtype
6202 12 Nov 12 nicklas 156   // NOTE! User may have selected a different subtype in the form than what is
6202 12 Nov 12 nicklas 157   // currently saved so if a subtype_id is sent in the request we use that
5644 26 May 11 nicklas 158   String selectedCategoryName = null;
5644 26 May 11 nicklas 159   try
5644 26 May 11 nicklas 160   {
5644 26 May 11 nicklas 161     ItemSubtype subtype = null;
6319 09 Sep 13 nicklas 162     if (subtypeId > 0)
5644 26 May 11 nicklas 163     {
6319 09 Sep 13 nicklas 164       subtype = ItemSubtype.getById(dc, subtypeId);
6319 09 Sep 13 nicklas 165     }
6319 09 Sep 13 nicklas 166     else if (item instanceof Subtypable)
6319 09 Sep 13 nicklas 167     {
5644 26 May 11 nicklas 168       subtype = ((Subtypable)item).getItemSubtype();
5644 26 May 11 nicklas 169     }
6319 09 Sep 13 nicklas 170     else if (item instanceof BioPlate)
5644 26 May 11 nicklas 171     {
6319 09 Sep 13 nicklas 172       BioPlateType bpt = ((BioPlate)item).getBioPlateType();
6319 09 Sep 13 nicklas 173       subtype = bpt.getItemSubtype();
6319 09 Sep 13 nicklas 174       if (subtype == null) selectedCategoryName = bpt.getName();
5644 26 May 11 nicklas 175     }
7587 06 Feb 19 nicklas 176     else if (item instanceof RawBioAssay)
7587 06 Feb 19 nicklas 177     {
7587 06 Feb 19 nicklas 178       RawDataType rdt = ((RawBioAssay)item).getRawDataType();
7587 06 Feb 19 nicklas 179       selectedCategoryName = rdt.getName();
7587 06 Feb 19 nicklas 180     }
5644 26 May 11 nicklas 181     if (subtype != null) selectedCategoryName = subtype.getName();
5644 26 May 11 nicklas 182   }
5644 26 May 11 nicklas 183   catch (PermissionDeniedException ex)
5644 26 May 11 nicklas 184   {}
5644 26 May 11 nicklas 185   
6938 19 Aug 15 nicklas 186   //selectedCategoryName = "Test"; // DEBUG!!
6938 19 Aug 15 nicklas 187   
2452 30 Jun 06 nicklas 188   if (standalone)
2452 30 Jun 06 nicklas 189   {
2452 30 Jun 06 nicklas 190     sc.getCurrentContext(itemType).setObject("item", item);  
2452 30 Jun 06 nicklas 191   }
903 08 Jul 05 nicklas 192
2452 30 Jun 06 nicklas 193   String title = "Annotate " + 
3034 15 Dec 06 nicklas 194     HTML.encodeTags((item instanceof Nameable ? ((Nameable)item).getName() : 
2454 30 Jun 06 nicklas 195       (item == null ? " new item" : item.toString())));
2452 30 Jun 06 nicklas 196
2875 08 Nov 06 nicklas 197   // Queries to retrieve annotation types and protocol parameters
3979 19 Nov 07 nicklas 198   ItemQuery<AnnotationType> annotationTypeQuery = null;
3979 19 Nov 07 nicklas 199   String message = null;
6202 12 Nov 12 nicklas 200   if (item instanceof AnnotatableProxy)
3979 19 Nov 07 nicklas 201   {
3979 19 Nov 07 nicklas 202     AnnotatableProxy proxy = (AnnotatableProxy)item;
3979 19 Nov 07 nicklas 203     annotationTypeQuery = Base.getAnnotationTypesQuery(proxy);
3979 19 Nov 07 nicklas 204     message = proxy.getAnnotationMessage();
3979 19 Nov 07 nicklas 205   }
3979 19 Nov 07 nicklas 206   else
3979 19 Nov 07 nicklas 207   {
3979 19 Nov 07 nicklas 208     annotationTypeQuery = Base.getAnnotationTypesQuery(itemType, false);
3979 19 Nov 07 nicklas 209   }
2875 08 Nov 06 nicklas 210   final ItemQuery<AnnotationType> parameterQuery = Base.getProtocolParametersQuery(protocol);
2875 08 Nov 06 nicklas 211
8083 20 Oct 22 nicklas 212   if (projectId >= 0)
8083 20 Oct 22 nicklas 213   {
8083 20 Oct 22 nicklas 214     title += " (" + (project != null ? "for project: "+HTML.encodeTags(project.getName()) : "default values") + ")";
8083 20 Oct 22 nicklas 215     annotationTypeQuery.restrict(Restrictions.eq(Hql.property("projectAnnotations"), Expressions.bool(true)));
8083 20 Oct 22 nicklas 216     if (parameterQuery != null)
8083 20 Oct 22 nicklas 217     {
8083 20 Oct 22 nicklas 218       parameterQuery.restrict(Restrictions.eq(Hql.property("projectAnnotations"), Expressions.bool(true)));
8083 20 Oct 22 nicklas 219     }
8083 20 Oct 22 nicklas 220   }
8083 20 Oct 22 nicklas 221   
2518 14 Aug 06 nicklas 222   // Holds all categories that we have found
2518 14 Aug 06 nicklas 223   final Set<AnnotationTypeCategory> allCategories = 
7604 25 Feb 19 nicklas 224     new TreeSet<AnnotationTypeCategory>(new NameableComparator<>(false));
2518 14 Aug 06 nicklas 225   
7587 06 Feb 19 nicklas 226   // Load all ItemSubtypes that are NOT related to the current item type
7587 06 Feb 19 nicklas 227   // We need this to get rid of annotation type categories that are not intended
7587 06 Feb 19 nicklas 228   // for the current item type
7587 06 Feb 19 nicklas 229   Set<String> excludedCategories = new HashSet<>();
7587 06 Feb 19 nicklas 230   ItemQuery<ItemSubtype> query = ItemSubtype.getQuery(null);
7587 06 Feb 19 nicklas 231   query.restrict(Restrictions.neq(Hql.property("itemType"), Expressions.integer(itemType.getValue())));
7587 06 Feb 19 nicklas 232   for (ItemSubtype s : query.list(dc))
7587 06 Feb 19 nicklas 233   {
7587 06 Feb 19 nicklas 234     if (Annotatable.class.isAssignableFrom(s.getMainItemType().getItemClass()))
7587 06 Feb 19 nicklas 235     {
7587 06 Feb 19 nicklas 236       excludedCategories.add(s.getName());
7587 06 Feb 19 nicklas 237     }
7587 06 Feb 19 nicklas 238   }
7587 06 Feb 19 nicklas 239   // Raw data types are also used as subtypes
7587 06 Feb 19 nicklas 240   if (itemType != Item.RAWBIOASSAY)
7587 06 Feb 19 nicklas 241   {
7587 06 Feb 19 nicklas 242     for (RawDataType rdt : RawDataTypes.getRawDataTypes())
7587 06 Feb 19 nicklas 243     {
7587 06 Feb 19 nicklas 244       excludedCategories.add(rdt.getName());
7587 06 Feb 19 nicklas 245     }
7587 06 Feb 19 nicklas 246   }
7587 06 Feb 19 nicklas 247   
6202 12 Nov 12 nicklas 248   // Load existing annotations
6202 12 Nov 12 nicklas 249   AnnotationSet as = null;
6938 19 Aug 15 nicklas 250   Map<AnnotationType, Annotation> primary = new HashMap<AnnotationType, Annotation>();
6938 19 Aug 15 nicklas 251   List<Annotation> inherited = new ArrayList<Annotation>();
6202 12 Nov 12 nicklas 252   if (item != null && item.isAnnotated())
5074 24 Aug 09 nicklas 253   {
5074 24 Aug 09 nicklas 254     // Load the existing annotations
6202 12 Nov 12 nicklas 255     as = item.getAnnotationSet();
8083 20 Oct 22 nicklas 256     ItemQuery<Annotation> aQuery = projectId < 0 ? as.getAnnotations(null) : as.getProjectAnnotations(null, project);
6938 19 Aug 15 nicklas 257     aQuery.order(Orders.asc(Hql.property("annotationType.name")));
6938 19 Aug 15 nicklas 258     List<Annotation> annotations = aQuery.list(dc);
5074 24 Aug 09 nicklas 259     for (Annotation a : annotations)
5074 24 Aug 09 nicklas 260     {
5074 24 Aug 09 nicklas 261       try
5074 24 Aug 09 nicklas 262       {
6938 19 Aug 15 nicklas 263         if (a.getSource() == Annotation.Source.PRIMARY)
6938 19 Aug 15 nicklas 264         {
6938 19 Aug 15 nicklas 265           primary.put(a.getAnnotationType(), a);
6938 19 Aug 15 nicklas 266         }
6938 19 Aug 15 nicklas 267         else
6938 19 Aug 15 nicklas 268         {
6938 19 Aug 15 nicklas 269           inherited.add(a);
6938 19 Aug 15 nicklas 270         }
5074 24 Aug 09 nicklas 271       }
5074 24 Aug 09 nicklas 272       catch (PermissionDeniedException ex)
5074 24 Aug 09 nicklas 273       {}
5074 24 Aug 09 nicklas 274     }
5074 24 Aug 09 nicklas 275   }
6202 12 Nov 12 nicklas 276   
6202 12 Nov 12 nicklas 277   // Load all annotation types that available from multiple sources:
6202 12 Nov 12 nicklas 278   // * As defined by the server admin for the current item type
6202 12 Nov 12 nicklas 279   // * Existing on the current item
6202 12 Nov 12 nicklas 280   // * Defined as protocol parameters for the current protocol
7604 25 Feb 19 nicklas 281   Set<AnnotationType> annotationTypes = new TreeSet<AnnotationType>(new NameableComparator<>(false));
6202 12 Nov 12 nicklas 282   Set<AnnotationType> protocolParameters = new HashSet<AnnotationType>();
6202 12 Nov 12 nicklas 283   annotationTypes.addAll(annotationTypeQuery.list(dc));
6938 19 Aug 15 nicklas 284   annotationTypes.addAll(primary.keySet());
6202 12 Nov 12 nicklas 285   if (parameterQuery != null) 
6202 12 Nov 12 nicklas 286   {
6202 12 Nov 12 nicklas 287     protocolParameters.addAll(parameterQuery.list(dc));
6202 12 Nov 12 nicklas 288     annotationTypes.addAll(protocolParameters);
6202 12 Nov 12 nicklas 289   }
903 08 Jul 05 nicklas 290
6202 12 Nov 12 nicklas 291   // Build JSON objects for all annotation types, the current values and annotation type categories
6202 12 Nov 12 nicklas 292   JSONArray jsonAnnotations = new JSONArray();
6202 12 Nov 12 nicklas 293   for (AnnotationType at : annotationTypes)
6202 12 Nov 12 nicklas 294   {
6938 19 Aug 15 nicklas 295     Annotation a = primary.get(at);
6938 19 Aug 15 nicklas 296     if (at.isRemoved() && a == null) continue;
6947 08 Sep 15 nicklas 297     JSONObject json = AnnotationUtil.createJsonForAnnotationTypeAndAnnotation(dc, at, a, null, protocolParameters.contains(at), allCategories);
6938 19 Aug 15 nicklas 298     jsonAnnotations.add(json);
6202 12 Nov 12 nicklas 299   }
6938 19 Aug 15 nicklas 300   for (Annotation a : inherited)
6938 19 Aug 15 nicklas 301   {
6938 19 Aug 15 nicklas 302     AnnotationType at = a.getAnnotationType();
6947 08 Sep 15 nicklas 303     JSONObject json = AnnotationUtil.createJsonForAnnotationTypeAndAnnotation(dc, at, a, null, false, allCategories);
6938 19 Aug 15 nicklas 304     jsonAnnotations.add(json);
6938 19 Aug 15 nicklas 305   }
6947 08 Sep 15 nicklas 306   
6947 08 Sep 15 nicklas 307   // Build JSON for parents submitted via request parameter
6947 08 Sep 15 nicklas 308   JSONArray jsonParents = new JSONArray();
6947 08 Sep 15 nicklas 309   if (parents != null)
6947 08 Sep 15 nicklas 310   {
6947 08 Sep 15 nicklas 311     for (String p : parents) jsonParents.add(p);
6947 08 Sep 15 nicklas 312   }
6947 08 Sep 15 nicklas 313   boolean canInherit = jsonParents.size() > 0;
6947 08 Sep 15 nicklas 314   if (!canInherit && item != null)
6947 08 Sep 15 nicklas 315   {
6947 08 Sep 15 nicklas 316     Set<Annotatable> parentItems = item.getAnnotatableParents();
6947 08 Sep 15 nicklas 317     canInherit = parentItems != null && parentItems.size() > 0;
6947 08 Sep 15 nicklas 318   }
6202 12 Nov 12 nicklas 319   %>
6246 25 Feb 13 nicklas 320   <base:page type="<%=standalone ? "popup" : "iframe"%>" title="<%=title%>">
6946 07 Sep 15 nicklas 321   <base:head scripts="~annotate.js,menu.js" styles="parameters.css,toolbar.css,menu.css">
6938 19 Aug 15 nicklas 322   <style>
6938 19 Aug 15 nicklas 323   .first-primary:before
6938 19 Aug 15 nicklas 324   {
6938 19 Aug 15 nicklas 325     content: '― Primary Annotations ―';
6938 19 Aug 15 nicklas 326     font-variant: small-caps;
6938 19 Aug 15 nicklas 327     font-size: 80%;
6938 19 Aug 15 nicklas 328     font-weight: bold;
6938 19 Aug 15 nicklas 329     color: #999999;
6938 19 Aug 15 nicklas 330   }
6938 19 Aug 15 nicklas 331   
6938 19 Aug 15 nicklas 332   .first-inherited:before
6938 19 Aug 15 nicklas 333   {
6938 19 Aug 15 nicklas 334     content: '― Inherited & Cloned ―';
6938 19 Aug 15 nicklas 335     font-variant: small-caps;
6938 19 Aug 15 nicklas 336     font-size: 80%;
6938 19 Aug 15 nicklas 337     font-weight: bold;
6938 19 Aug 15 nicklas 338     color: #999999;
6938 19 Aug 15 nicklas 339   }
6938 19 Aug 15 nicklas 340   
6945 04 Sep 15 nicklas 341   
6945 04 Sep 15 nicklas 342   .parameterlist .param 
6945 04 Sep 15 nicklas 343   {
6945 04 Sep 15 nicklas 344     padding-right: 20px;
6945 04 Sep 15 nicklas 345   }
6945 04 Sep 15 nicklas 346   .parameterlist .param.selected 
6945 04 Sep 15 nicklas 347   {
6945 04 Sep 15 nicklas 348     padding-right: 20px;
6945 04 Sep 15 nicklas 349   }
6945 04 Sep 15 nicklas 350   .parameterlist .param:hover 
6945 04 Sep 15 nicklas 351   {
6945 04 Sep 15 nicklas 352     padding-right: 18px;
6945 04 Sep 15 nicklas 353   }
6945 04 Sep 15 nicklas 354   
6946 07 Sep 15 nicklas 355   .parameterlist .param input, .parameterlist .check-all
6945 04 Sep 15 nicklas 356   {
6945 04 Sep 15 nicklas 357     position: absolute;
6945 04 Sep 15 nicklas 358     right: 1px;
6945 04 Sep 15 nicklas 359     margin-top: 1px;
6945 04 Sep 15 nicklas 360   }
6946 07 Sep 15 nicklas 361   .parameterlist .check-all
6946 07 Sep 15 nicklas 362   {
6946 07 Sep 15 nicklas 363     padding-right: 2px;
6946 07 Sep 15 nicklas 364   }
6945 04 Sep 15 nicklas 365   
6938 19 Aug 15 nicklas 366   #selected-name
6938 19 Aug 15 nicklas 367   {
6938 19 Aug 15 nicklas 368     font-weight: bold;
6938 19 Aug 15 nicklas 369   }
6938 19 Aug 15 nicklas 370   
6938 19 Aug 15 nicklas 371   #selected-description
6938 19 Aug 15 nicklas 372   {
6938 19 Aug 15 nicklas 373     margin-left: 0px; 
6938 19 Aug 15 nicklas 374     margin-right: 0px;
6938 19 Aug 15 nicklas 375     display: none;
6938 19 Aug 15 nicklas 376   }
6938 19 Aug 15 nicklas 377   
6938 19 Aug 15 nicklas 378   #none-selected
6938 19 Aug 15 nicklas 379   {
6938 19 Aug 15 nicklas 380     display: none;
6938 19 Aug 15 nicklas 381     margin-top: 2em;
6938 19 Aug 15 nicklas 382   }
6938 19 Aug 15 nicklas 383   
6938 19 Aug 15 nicklas 384   #selected-container > div
6938 19 Aug 15 nicklas 385   {
6938 19 Aug 15 nicklas 386     display: none;
6938 19 Aug 15 nicklas 387   }
6938 19 Aug 15 nicklas 388   
6938 19 Aug 15 nicklas 389   #selected-container.none-selected #none-selected
6938 19 Aug 15 nicklas 390   {
6938 19 Aug 15 nicklas 391     display: block;
6938 19 Aug 15 nicklas 392   }
6938 19 Aug 15 nicklas 393   #selected-container.none-selected.no-annotations #none-selected
6938 19 Aug 15 nicklas 394   {
6938 19 Aug 15 nicklas 395     display: none;
6938 19 Aug 15 nicklas 396   }
6938 19 Aug 15 nicklas 397   
6943 01 Sep 15 nicklas 398   #selected-container.has-selected #info-container
6938 19 Aug 15 nicklas 399   {
6938 19 Aug 15 nicklas 400     display: block;
6938 19 Aug 15 nicklas 401   }
6938 19 Aug 15 nicklas 402   
6938 19 Aug 15 nicklas 403   #selected-container.has-description #selected-description
6938 19 Aug 15 nicklas 404   {
6938 19 Aug 15 nicklas 405     display: block;
6938 19 Aug 15 nicklas 406   }
6938 19 Aug 15 nicklas 407
6938 19 Aug 15 nicklas 408   #selected-container.INHERITED #inherited-container,
6938 19 Aug 15 nicklas 409   #selected-container.CLONED #inherited-container
6938 19 Aug 15 nicklas 410   {
6938 19 Aug 15 nicklas 411     display: block;
6943 01 Sep 15 nicklas 412     border-left-width: 2px;
6943 01 Sep 15 nicklas 413     padding: 2px 5px;
6943 01 Sep 15 nicklas 414     margin: 0.5em 0;
6938 19 Aug 15 nicklas 415   }
6938 19 Aug 15 nicklas 416
6938 19 Aug 15 nicklas 417   #selected-container.inherited-missing #inherited-missing
6938 19 Aug 15 nicklas 418   {
6938 19 Aug 15 nicklas 419     display: block;
6943 01 Sep 15 nicklas 420     border-left-width: 2px;
6943 01 Sep 15 nicklas 421     padding: 2px 5px;
6943 01 Sep 15 nicklas 422     margin: 0.5em 0;
6938 19 Aug 15 nicklas 423   }
6938 19 Aug 15 nicklas 424   #selected-container.inherited-missing #inherited-container
6938 19 Aug 15 nicklas 425   {
6938 19 Aug 15 nicklas 426     display: none;
6938 19 Aug 15 nicklas 427   }
6938 19 Aug 15 nicklas 428   
7334 11 Apr 17 nicklas 429   #selected-container.project-annotations #project-annotations-container
7334 11 Apr 17 nicklas 430   {
7334 11 Apr 17 nicklas 431     display: block;
7334 11 Apr 17 nicklas 432     border-left-width: 2px;
7334 11 Apr 17 nicklas 433     padding: 2px 5px;
7334 11 Apr 17 nicklas 434     margin: 0.5em 0;
7334 11 Apr 17 nicklas 435   }
7334 11 Apr 17 nicklas 436   
7334 11 Apr 17 nicklas 437   #project-annotations-message
7334 11 Apr 17 nicklas 438   {
7334 11 Apr 17 nicklas 439     font-style: italic;
7334 11 Apr 17 nicklas 440   }
7334 11 Apr 17 nicklas 441   
6943 01 Sep 15 nicklas 442   #inherited-item
6943 01 Sep 15 nicklas 443   {
6943 01 Sep 15 nicklas 444     font-style: italic;
6943 01 Sep 15 nicklas 445   }
6943 01 Sep 15 nicklas 446   
6945 04 Sep 15 nicklas 447   #inherited-modified, #inherited-clone
6943 01 Sep 15 nicklas 448   {
6943 01 Sep 15 nicklas 449     display: none;
6943 01 Sep 15 nicklas 450   }
6943 01 Sep 15 nicklas 451
6943 01 Sep 15 nicklas 452   #selected-container.modified #inherited-modified
6943 01 Sep 15 nicklas 453   {
6943 01 Sep 15 nicklas 454     display: inline;
6943 01 Sep 15 nicklas 455   }
6943 01 Sep 15 nicklas 456   
6943 01 Sep 15 nicklas 457   #selected-container.INHERITED #inherited-clone
6943 01 Sep 15 nicklas 458   {
6943 01 Sep 15 nicklas 459     display: inline;
6943 01 Sep 15 nicklas 460   }
6943 01 Sep 15 nicklas 461   
6938 19 Aug 15 nicklas 462   #selected-container.PRIMARY #input-container,
6938 19 Aug 15 nicklas 463   #selected-container.CLONED #input-container
6938 19 Aug 15 nicklas 464   {
6938 19 Aug 15 nicklas 465     display: block;
6938 19 Aug 15 nicklas 466   }
6938 19 Aug 15 nicklas 467   
6938 19 Aug 15 nicklas 468   #input-container > div
6938 19 Aug 15 nicklas 469   {
6938 19 Aug 15 nicklas 470     display: none;
6938 19 Aug 15 nicklas 471   }
6938 19 Aug 15 nicklas 472   
6938 19 Aug 15 nicklas 473   #selected-container.ENUM-SINGLE #ENUM-SINGLE
6938 19 Aug 15 nicklas 474   {
6938 19 Aug 15 nicklas 475     display: block;
6938 19 Aug 15 nicklas 476   }
6938 19 Aug 15 nicklas 477   #selected-container.ENUM-MULTIPLE #ENUM-MULTIPLE
6938 19 Aug 15 nicklas 478   {
6938 19 Aug 15 nicklas 479     display: block;
6938 19 Aug 15 nicklas 480   }
6938 19 Aug 15 nicklas 481   #selected-container.ENUM-RADIO-CHECKBOX #ENUM-RADIO-CHECKBOX
6938 19 Aug 15 nicklas 482   {
6938 19 Aug 15 nicklas 483     display: block;
6938 19 Aug 15 nicklas 484   }
6938 19 Aug 15 nicklas 485   #selected-container.STRING #STRING-container
6938 19 Aug 15 nicklas 486   {
6938 19 Aug 15 nicklas 487     display: block;
6938 19 Aug 15 nicklas 488   }
6938 19 Aug 15 nicklas 489   #selected-container.TEXT #TEXT-container
6938 19 Aug 15 nicklas 490   {
6938 19 Aug 15 nicklas 491     display: block;
6938 19 Aug 15 nicklas 492   }
6938 19 Aug 15 nicklas 493   #selected-container.INT #INT-container
6938 19 Aug 15 nicklas 494   {
6938 19 Aug 15 nicklas 495     display: block;
6938 19 Aug 15 nicklas 496   }
6938 19 Aug 15 nicklas 497   #selected-container.LONG #LONG-container
6938 19 Aug 15 nicklas 498   {
6938 19 Aug 15 nicklas 499     display: block;
6938 19 Aug 15 nicklas 500   }
6938 19 Aug 15 nicklas 501   #selected-container.FLOAT #FLOAT-container
6938 19 Aug 15 nicklas 502   {
6938 19 Aug 15 nicklas 503     display: block;
6938 19 Aug 15 nicklas 504   }
6938 19 Aug 15 nicklas 505   #selected-container.DOUBLE #DOUBLE-container
6938 19 Aug 15 nicklas 506   {
6938 19 Aug 15 nicklas 507     display: block;
6938 19 Aug 15 nicklas 508   }
6938 19 Aug 15 nicklas 509   #selected-container.BOOLEAN #BOOLEAN-container
6938 19 Aug 15 nicklas 510   {
6938 19 Aug 15 nicklas 511     display: block;
6938 19 Aug 15 nicklas 512   }
6938 19 Aug 15 nicklas 513   #selected-container.DATE #DATE-container
6938 19 Aug 15 nicklas 514   {
6938 19 Aug 15 nicklas 515     display: block;
6938 19 Aug 15 nicklas 516   }
6938 19 Aug 15 nicklas 517   #selected-container.TIMESTAMP #TIMESTAMP-container
6938 19 Aug 15 nicklas 518   {
6938 19 Aug 15 nicklas 519     display: block;
6938 19 Aug 15 nicklas 520   }
6938 19 Aug 15 nicklas 521   #selected-container.has-unit .numeric
6938 19 Aug 15 nicklas 522   {
6938 19 Aug 15 nicklas 523     float: left;
6938 19 Aug 15 nicklas 524     margin-right: 0.25em;
6938 19 Aug 15 nicklas 525   }
6938 19 Aug 15 nicklas 526   #selected-container.has-unit #unit-container
6938 19 Aug 15 nicklas 527   {
6938 19 Aug 15 nicklas 528     display: block;
6938 19 Aug 15 nicklas 529   }
6955 28 Sep 15 nicklas 530   #selected-container.multiple #multiple-container
6955 28 Sep 15 nicklas 531   {
6955 28 Sep 15 nicklas 532     display: block;
6955 28 Sep 15 nicklas 533   }
7206 19 Oct 16 nicklas 534   
7206 19 Oct 16 nicklas 535   #selected-container.no-annotate-permission #input-container
7206 19 Oct 16 nicklas 536   {
7206 19 Oct 16 nicklas 537     pointer-events: none;
7206 19 Oct 16 nicklas 538     cursor: default;
7206 19 Oct 16 nicklas 539     opacity: 0.5;
7206 19 Oct 16 nicklas 540     filter: url(filters.svg#grayscale);
7206 19 Oct 16 nicklas 541   }
7206 19 Oct 16 nicklas 542   #selected-container.no-annotate-permission #no-annotate-permission
7206 19 Oct 16 nicklas 543   {
7206 19 Oct 16 nicklas 544     display: block;
7206 19 Oct 16 nicklas 545   }
6938 19 Aug 15 nicklas 546   .not-specified
6938 19 Aug 15 nicklas 547   {
6938 19 Aug 15 nicklas 548     font-style: italic;
6938 19 Aug 15 nicklas 549   }
6938 19 Aug 15 nicklas 550   </style>
6938 19 Aug 15 nicklas 551   </base:head>
6202 12 Nov 12 nicklas 552   <base:body>
2452 30 Jun 06 nicklas 553     <%
2452 30 Jun 06 nicklas 554     if (standalone)
2452 30 Jun 06 nicklas 555     {
2452 30 Jun 06 nicklas 556       %>
5913 15 Dec 11 nicklas 557       <h1><%=title%> <base:help helpid="annotations.edit" /></h1>
5913 15 Dec 11 nicklas 558       <div class="content">
2452 30 Jun 06 nicklas 559       <%
2452 30 Jun 06 nicklas 560     }
2452 30 Jun 06 nicklas 561     %>
6202 12 Nov 12 nicklas 562     <div id="page-data" class="datacontainer"
6947 08 Sep 15 nicklas 563       data-item-type="<%=itemType.name() %>"
6947 08 Sep 15 nicklas 564       data-item-id="<%=itemId %>"
6202 12 Nov 12 nicklas 565       data-annotations="<%=HTML.encodeTags(jsonAnnotations.toJSONString()) %>"
6947 08 Sep 15 nicklas 566       data-parents="<%=HTML.encodeTags(jsonParents.toJSONString()) %>"
6202 12 Nov 12 nicklas 567       data-annotation-type-id="<%=annotationTypeId%>"
6938 19 Aug 15 nicklas 568       data-annotation-id="<%=annotationId %>"
8083 20 Oct 22 nicklas 569       data-project-id="<%=projectId%>"
8083 20 Oct 22 nicklas 570       data-active-project-id="<%=sc.getActiveProjectId()%>"
6202 12 Nov 12 nicklas 571       data-date-format="<%=htmlDateFormat%>"
6202 12 Nov 12 nicklas 572       data-datetime-format="<%=htmlDateTimeFormat%>"
6202 12 Nov 12 nicklas 573       ></div>
903 08 Jul 05 nicklas 574     <form name="annotations">
5913 15 Dec 11 nicklas 575     
6946 07 Sep 15 nicklas 576     <m:menu
6946 07 Sep 15 nicklas 577       id="more-actions"
6946 07 Sep 15 nicklas 578       style="display: none;">  
6946 07 Sep 15 nicklas 579       <m:menuitem id="btnSync" title="Sync" icon="cloned-outofsync.png" 
6946 07 Sep 15 nicklas 580         tooltip="Synchronize the selected annotation"
6946 07 Sep 15 nicklas 581       />
6946 07 Sep 15 nicklas 582       <m:menuitem id="btnClone" title="Clone" icon="cloned.png" 
6946 07 Sep 15 nicklas 583         tooltip="Clone the selected annotations"
6946 07 Sep 15 nicklas 584       />
6946 07 Sep 15 nicklas 585       <m:menuitem id="btnUnclone" title="Unclone" icon="inherited.png" 
6946 07 Sep 15 nicklas 586         tooltip="Revert cloned annotations to inherited"
6946 07 Sep 15 nicklas 587       />
6946 07 Sep 15 nicklas 588     </m:menu>
6946 07 Sep 15 nicklas 589     
6946 07 Sep 15 nicklas 590     
5913 15 Dec 11 nicklas 591     <div class="absolutefull">
6607 19 Nov 14 nicklas 592       <div class="absolutefull bg-filled-100 rightborder" style="width: 18em;">
5913 15 Dec 11 nicklas 593         <div class="absolutefull" style="height: 2em;">
5913 15 Dec 11 nicklas 594           <table style="margin: auto; height: 100%;"><tr><td>
6946 07 Sep 15 nicklas 595           <base:icon image="filter.png" />
6946 07 Sep 15 nicklas 596           <select name="categories" id="categories" style="width: 15em;">
5913 15 Dec 11 nicklas 597           <option value="-1">- all -
5913 15 Dec 11 nicklas 598           <%
5913 15 Dec 11 nicklas 599           if (protocol != null)
5913 15 Dec 11 nicklas 600           {
5913 15 Dec 11 nicklas 601             %>
5913 15 Dec 11 nicklas 602             <option value="-2">- protocol parameters -
5913 15 Dec 11 nicklas 603             <%
5913 15 Dec 11 nicklas 604           }
5913 15 Dec 11 nicklas 605           %>
5913 15 Dec 11 nicklas 606           <option value="0">- uncategorized -
5913 15 Dec 11 nicklas 607           <%
5913 15 Dec 11 nicklas 608           for (AnnotationTypeCategory category : allCategories)
5913 15 Dec 11 nicklas 609           {
5913 15 Dec 11 nicklas 610             boolean selected = category.getName().equals(selectedCategoryName);
7587 06 Feb 19 nicklas 611             if (!selected && excludedCategories.contains(category.getName())) continue;
5913 15 Dec 11 nicklas 612             %>
5913 15 Dec 11 nicklas 613             <option value="<%=category.getId()%>"
5913 15 Dec 11 nicklas 614               title="<%=HTML.encodeTags(category.getDescription())%>"
5913 15 Dec 11 nicklas 615               <%=selected ? "selected" : "" %>
5913 15 Dec 11 nicklas 616             ><%=HTML.encodeTags(category.getName())%>
5913 15 Dec 11 nicklas 617             <%
5913 15 Dec 11 nicklas 618           }
5913 15 Dec 11 nicklas 619           %>
5913 15 Dec 11 nicklas 620           </select>
5913 15 Dec 11 nicklas 621           </td></tr></table>
5913 15 Dec 11 nicklas 622         </div>
5913 15 Dec 11 nicklas 623         
6938 19 Aug 15 nicklas 624         <div id="annotation-list" class="absolutefull parameterlist topborder" 
6946 07 Sep 15 nicklas 625           style="top: 2em; bottom: 3em;">
6947 08 Sep 15 nicklas 626           <tbl:toolbar subclass="bottomborder" visible="<%=canInherit || annotationTypes.size()>0 || inherited.size()>0 %>">
6946 07 Sep 15 nicklas 627             <tbl:button id="btnAdd" title="Inherit&hellip;" image="add.png" 
6946 07 Sep 15 nicklas 628               tooltip="Inherit more annotations..."
6947 08 Sep 15 nicklas 629               disabled="<%=!canInherit%>"
6946 07 Sep 15 nicklas 630             />
6946 07 Sep 15 nicklas 631             <tbl:button id="btnDelete" title="Delete" image="remove.png" 
6946 07 Sep 15 nicklas 632               tooltip="Delete annotations"
6946 07 Sep 15 nicklas 633             />
6946 07 Sep 15 nicklas 634             <tbl:button id="btnMore" 
6946 07 Sep 15 nicklas 635               subclass="auto-init"
6946 07 Sep 15 nicklas 636               data-auto-init="menu-anchor"
6946 07 Sep 15 nicklas 637               data-menu-id="more-actions"
6946 07 Sep 15 nicklas 638               title="<img src=\"../../images/mini_scroll_down.png\">" image="menu.png" 
6946 07 Sep 15 nicklas 639               tooltip="More actions..."
6946 07 Sep 15 nicklas 640               />
6946 07 Sep 15 nicklas 641           </tbl:toolbar>
6946 07 Sep 15 nicklas 642             <%
6946 07 Sep 15 nicklas 643             if (annotationTypes.size() == 0 && inherited.size() == 0)
6946 07 Sep 15 nicklas 644             {
6946 07 Sep 15 nicklas 645               %>
6946 07 Sep 15 nicklas 646               <div class="messagecontainer error">
6946 07 Sep 15 nicklas 647                 There are no annotation types defined for this kind of item.
6946 07 Sep 15 nicklas 648               </div>
6946 07 Sep 15 nicklas 649               <%
6946 07 Sep 15 nicklas 650             }
5913 15 Dec 11 nicklas 651             %>
6947 08 Sep 15 nicklas 652           <div id="primary-list">
6947 08 Sep 15 nicklas 653             <div class="first-primary">
6947 08 Sep 15 nicklas 654               <base:icon id="check-all-primary" image="check_uncheck.png" subclass="check-all" 
6947 08 Sep 15 nicklas 655                 tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)"
6947 08 Sep 15 nicklas 656               />
6947 08 Sep 15 nicklas 657             </div>
6946 07 Sep 15 nicklas 658           </div>
6946 07 Sep 15 nicklas 659           <div id="inherited-list">
6946 07 Sep 15 nicklas 660             <div class="first-inherited">
6946 07 Sep 15 nicklas 661               <base:icon id="check-all-inherited" image="check_uncheck.png" subclass="check-all" 
6946 07 Sep 15 nicklas 662                 tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)"
6946 07 Sep 15 nicklas 663               />
5913 15 Dec 11 nicklas 664             </div>
6946 07 Sep 15 nicklas 665           </div>
5913 15 Dec 11 nicklas 666         </div>
6946 07 Sep 15 nicklas 667         
6946 07 Sep 15 nicklas 668         <div class="absolutefull topborder" style="top: auto; bottom: 0em; height: 3em;">
6946 07 Sep 15 nicklas 669           <table style="height: 100%; margin:auto;"><tr><td>
6610 20 Nov 14 nicklas 670           <base:icon image="hasvalues.png" /> = has value(s)<br>
5946 03 Feb 12 nicklas 671           <base:icon image="parameter.png" /> = protocol parameter
5913 15 Dec 11 nicklas 672           </td></tr></table>
5913 15 Dec 11 nicklas 673         </div>
5913 15 Dec 11 nicklas 674       </div>
5913 15 Dec 11 nicklas 675       
5913 15 Dec 11 nicklas 676       <div class="absolutefull input100" style="left: 18em; padding: 8px;">
2875 08 Nov 06 nicklas 677         <%
5913 15 Dec 11 nicklas 678         if (message != null)
2875 08 Nov 06 nicklas 679         {
2875 08 Nov 06 nicklas 680           %>
5913 15 Dec 11 nicklas 681           <div class="messagecontainer help" style="margin-top: 0.2em;"><%=message%></div>
2875 08 Nov 06 nicklas 682           <%
2875 08 Nov 06 nicklas 683         }
2518 14 Aug 06 nicklas 684         %>
6938 19 Aug 15 nicklas 685         <div id="selected-container">
6938 19 Aug 15 nicklas 686           <div id="none-selected" class="messagecontainer note">
6938 19 Aug 15 nicklas 687             <base:icon image="goback.png" /> Select an annotation.
6938 19 Aug 15 nicklas 688           </div>
6938 19 Aug 15 nicklas 689
7206 19 Oct 16 nicklas 690           <div id="no-annotate-permission" class="messagecontainer error">
7206 19 Oct 16 nicklas 691             You do not have permission to change this annotation.
7206 19 Oct 16 nicklas 692           </div>
7206 19 Oct 16 nicklas 693
6938 19 Aug 15 nicklas 694           <div id="info-container">
6938 19 Aug 15 nicklas 695             <span id="selected-name">Name</span>
6938 19 Aug 15 nicklas 696             (<span id="selected-type">type</span>)
6938 19 Aug 15 nicklas 697           </div>
6938 19 Aug 15 nicklas 698           
6943 01 Sep 15 nicklas 699           <div id="inherited-container" class="bg-filled-100">
6943 01 Sep 15 nicklas 700             <span id="inherited-item"></span><br>
6943 01 Sep 15 nicklas 701             <span id="inherited-values"></span>
6943 01 Sep 15 nicklas 702             <span id="inherited-modified">(modified; <span id="sync-modified" class="link" title="Synchronize the annotation values with the parent item">sync</span>)</span>
6943 01 Sep 15 nicklas 703             <span id="inherited-clone">(<span id="convert-to-cloned" class="link" title="Clone the annotation values from the parent">clone</span>)</span>
6938 19 Aug 15 nicklas 704           </div>
6943 01 Sep 15 nicklas 705                     
6945 04 Sep 15 nicklas 706           <div id="inherited-missing" class="bg-filled-100">
6938 19 Aug 15 nicklas 707             Cloned from an unknown item.
6938 19 Aug 15 nicklas 708           </div>
7334 11 Apr 17 nicklas 709           
7334 11 Apr 17 nicklas 710           <div id="project-annotations-container" class="bg-filled-100">  
7334 11 Apr 17 nicklas 711             <span id="project-annotations-message"></span>
7334 11 Apr 17 nicklas 712             <span id="default-values"></span>
7334 11 Apr 17 nicklas 713           </div>
6938 19 Aug 15 nicklas 714         
6938 19 Aug 15 nicklas 715           <div id="input-container">
6955 28 Sep 15 nicklas 716             <div id="multiple-container">
6955 28 Sep 15 nicklas 717               
6955 28 Sep 15 nicklas 718               <select name="multi-values" id="multi-values" size="5" style="width: calc(100% - 8px);">
6955 28 Sep 15 nicklas 719               </select>
6955 28 Sep 15 nicklas 720               <table>
6955 28 Sep 15 nicklas 721               <tr>
6955 28 Sep 15 nicklas 722                 <td><base:button id="btnMultiAdd" title="Add" tooltip="Add a new value" /></td>
6955 28 Sep 15 nicklas 723                 <td><base:button id="btnMultiRemove" title="Remove" tooltip="Remove the selected values"/></td>
6955 28 Sep 15 nicklas 724               </tr>
6955 28 Sep 15 nicklas 725               </table>
6955 28 Sep 15 nicklas 726             </div>
6938 19 Aug 15 nicklas 727           
6938 19 Aug 15 nicklas 728             <div id="ENUM-SINGLE">
6938 19 Aug 15 nicklas 729               <select name="ENUM-SINGLE-input" id="ENUM-SINGLE-input" 
6955 28 Sep 15 nicklas 730                 style="min-width: 15em;">
910 11 Jul 05 nicklas 731               </select>
6938 19 Aug 15 nicklas 732             </div>
6938 19 Aug 15 nicklas 733               
6938 19 Aug 15 nicklas 734             <div id="ENUM-MULTIPLE">
6938 19 Aug 15 nicklas 735               <select name="ENUM-MULTIPLE-input" id="ENUM-MULTIPLE-input" 
6955 28 Sep 15 nicklas 736                 multiple size="10" style="min-width: 15em;">
6938 19 Aug 15 nicklas 737               </select>
6938 19 Aug 15 nicklas 738             </div>
6938 19 Aug 15 nicklas 739               
6938 19 Aug 15 nicklas 740             <div id="ENUM-RADIO-CHECKBOX">
6938 19 Aug 15 nicklas 741               radios/checkboxes
6938 19 Aug 15 nicklas 742             </div>
6938 19 Aug 15 nicklas 743         
6938 19 Aug 15 nicklas 744             <div id="STRING-container">
6938 19 Aug 15 nicklas 745               <input name="STRING-input" id="STRING-input" 
6938 19 Aug 15 nicklas 746                 type="text" class="text"
6938 19 Aug 15 nicklas 747                 maxlength="255" value="">
6938 19 Aug 15 nicklas 748             </div>
6938 19 Aug 15 nicklas 749             
6938 19 Aug 15 nicklas 750             <div id="TEXT-container">
6938 19 Aug 15 nicklas 751               <table style="width: 100%;">
6938 19 Aug 15 nicklas 752               <tr>
6938 19 Aug 15 nicklas 753                 <td>
6938 19 Aug 15 nicklas 754                 <textarea name="TEXT-input" id="TEXT-input" 
6938 19 Aug 15 nicklas 755                   class="text" rows="5"></textarea>
6938 19 Aug 15 nicklas 756                 </td>
6938 19 Aug 15 nicklas 757                 <td style="width: 20px;">
6938 19 Aug 15 nicklas 758                   <base:icon
6938 19 Aug 15 nicklas 759                     id="TEXT-zoom"
6938 19 Aug 15 nicklas 760                     image="zoom.png"
6938 19 Aug 15 nicklas 761                     tooltip="Edit in larger window" 
6938 19 Aug 15 nicklas 762                   />
6938 19 Aug 15 nicklas 763                 </td>
6938 19 Aug 15 nicklas 764               </tr>
6938 19 Aug 15 nicklas 765               </table>
6938 19 Aug 15 nicklas 766             </div>
6938 19 Aug 15 nicklas 767             
6938 19 Aug 15 nicklas 768             <div id="INT-container" class="numeric">
6938 19 Aug 15 nicklas 769               <input 
6938 19 Aug 15 nicklas 770                 name="INT-input" id="INT-input"
6938 19 Aug 15 nicklas 771                 class="text" type="text" 
6938 19 Aug 15 nicklas 772                 value="" style="width: 12em;" maxlength="20">
6938 19 Aug 15 nicklas 773             </div>
6938 19 Aug 15 nicklas 774
6938 19 Aug 15 nicklas 775             <div id="LONG-container" class="numeric">
6938 19 Aug 15 nicklas 776               <input 
6938 19 Aug 15 nicklas 777                 name="LONG-input" id="LONG-input"
6938 19 Aug 15 nicklas 778                 class="text" type="text" 
6938 19 Aug 15 nicklas 779                 value="" style="width: 12em;" maxlength="20">
6938 19 Aug 15 nicklas 780             </div>
6938 19 Aug 15 nicklas 781             
6938 19 Aug 15 nicklas 782             <div id="FLOAT-container" class="numeric">
6938 19 Aug 15 nicklas 783               <input 
6938 19 Aug 15 nicklas 784                 name="FLOAT-input" id="FLOAT-input"
6938 19 Aug 15 nicklas 785                 class="text" type="text"
6938 19 Aug 15 nicklas 786                 value="" style="width: 12em;" maxlength="20">
6938 19 Aug 15 nicklas 787             </div>
6938 19 Aug 15 nicklas 788
6938 19 Aug 15 nicklas 789             <div id="DOUBLE-container" class="numeric">
6938 19 Aug 15 nicklas 790               <input 
6938 19 Aug 15 nicklas 791                 name="DOUBLE-input" id="DOUBLE-input"
6938 19 Aug 15 nicklas 792                 class="text" type="text" 
6938 19 Aug 15 nicklas 793                 value="" style="width: 12em;" maxlength="20">
6938 19 Aug 15 nicklas 794             </div>
6938 19 Aug 15 nicklas 795           
6938 19 Aug 15 nicklas 796             <div id="unit-container">
6938 19 Aug 15 nicklas 797               <select name="unit" id="unit" style="min-width: 5em;"></select>
6938 19 Aug 15 nicklas 798             </div>
6938 19 Aug 15 nicklas 799             
6938 19 Aug 15 nicklas 800             <div id="DATE-container">
6938 19 Aug 15 nicklas 801               <table>
6938 19 Aug 15 nicklas 802               <tr>
5913 15 Dec 11 nicklas 803               <td>
6938 19 Aug 15 nicklas 804                 <input 
6938 19 Aug 15 nicklas 805                   name="DATE-input" id="DATE-input"
6938 19 Aug 15 nicklas 806                   class="text" type="text" 
6938 19 Aug 15 nicklas 807                   value="" style="width: 15em;" maxlength="20" 
6938 19 Aug 15 nicklas 808                   title="Enter date in format: <%=htmlDateFormat%>">
5913 15 Dec 11 nicklas 809               </td>
6938 19 Aug 15 nicklas 810               <td>
913 12 Jul 05 nicklas 811                 <base:button 
6938 19 Aug 15 nicklas 812                   id="DATE-calendar"
2445 29 Jun 06 nicklas 813                   image="calendar.png"
2445 29 Jun 06 nicklas 814                   title="Calendar&hellip;" 
6202 12 Nov 12 nicklas 815                   tooltip="Select a date from a calendar"
913 12 Jul 05 nicklas 816                 />
6938 19 Aug 15 nicklas 817               </td>
6938 19 Aug 15 nicklas 818               </tr>
6938 19 Aug 15 nicklas 819               </table>
6938 19 Aug 15 nicklas 820             </div>
6938 19 Aug 15 nicklas 821             
6938 19 Aug 15 nicklas 822             <div id="TIMESTAMP-container">
6938 19 Aug 15 nicklas 823               <table>
6938 19 Aug 15 nicklas 824               <tr>
6938 19 Aug 15 nicklas 825               <td>
6938 19 Aug 15 nicklas 826                 <input 
6938 19 Aug 15 nicklas 827                   name="TIMESTAMP-input" id="TIMESTAMP-input"
6938 19 Aug 15 nicklas 828                   class="text" type="text" 
6938 19 Aug 15 nicklas 829                   value="" style="width: 15em;" maxlength="20" 
6938 19 Aug 15 nicklas 830                   title="Enter date + time in format: <%=htmlDateTimeFormat%>">
6938 19 Aug 15 nicklas 831               </td>
6938 19 Aug 15 nicklas 832               <td>
5423 23 Sep 10 nicklas 833                 <base:button 
6938 19 Aug 15 nicklas 834                   id="TIMESTAMP-calendar"
5423 23 Sep 10 nicklas 835                   image="calendar.png"
5423 23 Sep 10 nicklas 836                   title="Calendar&hellip;" 
6938 19 Aug 15 nicklas 837                   tooltip="Select date and time from a calendar"
5423 23 Sep 10 nicklas 838                 />
6938 19 Aug 15 nicklas 839               </td>
6938 19 Aug 15 nicklas 840               </tr>
6938 19 Aug 15 nicklas 841               </table>
5913 15 Dec 11 nicklas 842             </div>
6938 19 Aug 15 nicklas 843           
6938 19 Aug 15 nicklas 844             <div id="BOOLEAN-container">
6938 19 Aug 15 nicklas 845               <label class="not-specified"><input type="radio" name="BOOLEAN-input" id="BOOLEAN-input-NULL" 
6938 19 Aug 15 nicklas 846                 value="" checked>- not specified -</label><br>
6938 19 Aug 15 nicklas 847               <label><input type="radio" name="BOOLEAN-input" id="BOOLEAN-input-TRUE" 
6938 19 Aug 15 nicklas 848                 value="true">true</label><br>
6938 19 Aug 15 nicklas 849               <label><input type="radio" name="BOOLEAN-input" id="BOOLEAN-input-FALSE"
6938 19 Aug 15 nicklas 850                 value="false">false</label>
6938 19 Aug 15 nicklas 851             </div>
910 11 Jul 05 nicklas 852           </div>
6938 19 Aug 15 nicklas 853           
7334 11 Apr 17 nicklas 854           <div id="selected-description" class="messagecontainer help"></div>
6938 19 Aug 15 nicklas 855         </div>
6938 19 Aug 15 nicklas 856   
5913 15 Dec 11 nicklas 857       </div>
5913 15 Dec 11 nicklas 858     </div>
903 08 Jul 05 nicklas 859     </form>
2452 30 Jun 06 nicklas 860     <%
2452 30 Jun 06 nicklas 861     if (standalone)
2452 30 Jun 06 nicklas 862     {
2452 30 Jun 06 nicklas 863       %>
2452 30 Jun 06 nicklas 864       </div>
5913 15 Dec 11 nicklas 865       <base:buttongroup subclass="dialogbuttons topborder">
7213 19 Oct 16 nicklas 866         <base:button id="btnSave" title="Save" visible="<%=annotatePermission%>" />
7213 19 Oct 16 nicklas 867         <base:button id="close" title="Cancel"  visible="<%=annotatePermission%>" />
7213 19 Oct 16 nicklas 868         <base:button id="close" title="Close" visible="<%=!annotatePermission%>" />
5913 15 Dec 11 nicklas 869       </base:buttongroup>
2452 30 Jun 06 nicklas 870       <form name="modified" method="post" action="index.jsp?ID=<%=ID%>">
2452 30 Jun 06 nicklas 871         <input type="hidden" name="cmd" value="SaveAnnotations">
2452 30 Jun 06 nicklas 872         <input type="hidden" name="item_type" value="<%=itemType.name()%>">
2452 30 Jun 06 nicklas 873         <input type="hidden" name="item_id" value="<%=itemId%>">
8083 20 Oct 22 nicklas 874         <%
8083 20 Oct 22 nicklas 875         if (projectId >= 0)
8083 20 Oct 22 nicklas 876         {
8083 20 Oct 22 nicklas 877           %>
8083 20 Oct 22 nicklas 878           <input type="hidden" name="project_id" value="<%=projectId%>">
8083 20 Oct 22 nicklas 879           <%
8083 20 Oct 22 nicklas 880         }
8083 20 Oct 22 nicklas 881         %>
2452 30 Jun 06 nicklas 882       </form>
2452 30 Jun 06 nicklas 883       <%
2452 30 Jun 06 nicklas 884     }
2452 30 Jun 06 nicklas 885     %>
903 08 Jul 05 nicklas 886   </base:body>
903 08 Jul 05 nicklas 887   </base:page>
903 08 Jul 05 nicklas 888   <%
903 08 Jul 05 nicklas 889 }
903 08 Jul 05 nicklas 890 finally
903 08 Jul 05 nicklas 891 {
903 08 Jul 05 nicklas 892   if (dc != null) dc.close();
903 08 Jul 05 nicklas 893 }
903 08 Jul 05 nicklas 894 %>