source: trunk/www/views/experiments/bioassaysets/view_bioassayset.jsp @ 5939

Last change on this file since 5939 was 5939, checked in by Nicklas Nordborg, 11 years ago

References #1655: GUI improvements

View pages for:

  • File server
  • Projects
  • Permission templates
  • Physical, derived and raw bioassays
  • Experiments, bioassay set
  • Formulas
  • Reporters
  • Reporter lists
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 20.2 KB
Line 
1<%-- $Id: view_bioassayset.jsp 5939 2012-01-30 14:42:18Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.ItemContext"
31  import="net.sf.basedb.core.Permission"
32  import="net.sf.basedb.core.Experiment"
33  import="net.sf.basedb.core.BioAssaySet"
34  import="net.sf.basedb.core.BioAssay"
35  import="net.sf.basedb.core.Transformation"
36  import="net.sf.basedb.core.Job"
37  import="net.sf.basedb.core.PluginDefinition"
38  import="net.sf.basedb.core.PluginConfiguration"
39  import="net.sf.basedb.core.User"
40  import="net.sf.basedb.core.ItemQuery"
41  import="net.sf.basedb.core.ItemResultList"
42  import="net.sf.basedb.core.Include"
43  import="net.sf.basedb.core.PermissionDeniedException"
44  import="net.sf.basedb.core.PluginDefinition"
45  import="net.sf.basedb.core.ParameterInfo"
46  import="net.sf.basedb.core.RawDataType"
47  import="net.sf.basedb.core.BasicItem"
48  import="net.sf.basedb.core.Nameable"
49  import="net.sf.basedb.core.File"
50  import="net.sf.basedb.core.plugin.GuiContext"
51  import="net.sf.basedb.core.plugin.Plugin"
52  import="net.sf.basedb.core.query.Orders"
53  import="net.sf.basedb.core.query.Hql"
54  import="net.sf.basedb.clients.web.Base"
55  import="net.sf.basedb.clients.web.PermissionUtil"
56  import="net.sf.basedb.clients.web.util.HTML"
57  import="net.sf.basedb.util.Values"
58  import="net.sf.basedb.util.formatter.Formatter"
59  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
60  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
61  import="net.sf.basedb.clients.web.extensions.JspContext"
62  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
63  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
64  import="net.sf.basedb.clients.web.extensions.plot.OverviewPlotAction"
65  import="net.sf.basedb.clients.web.extensions.plot.PlotGenerator"
66  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
67  import="net.sf.basedb.util.extensions.ActionIterator"
68  import="java.util.Date"
69  import="java.util.Map"
70  import="java.util.Set"
71  import="java.util.List"
72  import="java.util.Iterator"
73%>
74<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
75<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
76<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
77<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
78<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
79<%!
80  private static final Item itemType = Item.BIOASSAYSET;
81  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
82%>
83<%
84final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
85final String ID = sc.getId();
86final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
87final int itemId = cc.getId();
88final String tabId = Values.getString(request.getParameter("tab"), "properties");
89
90final float scale = Base.getScale(sc);
91final String root = request.getContextPath();
92final DbControl dc = sc.newDbControl();
93try
94{
95  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
96
97  String title = null;
98  final BioAssaySet bioAssaySet = BioAssaySet.getById(dc, itemId);
99  final Experiment experiment = bioAssaySet.getExperiment();
100  final int experimentId = experiment.getId();
101  final boolean hasDbSpots = bioAssaySet.getNumSpots() > 0;
102  Transformation transformation = bioAssaySet.getTransformation();
103  RawDataType rawDataType = experiment.getRawDataType();
104 
105  Job job = null;
106  boolean readJob = true;
107  PluginDefinition plugin = null;
108  boolean readPlugin = true;
109  PluginConfiguration configuration = null;
110  boolean readConfiguration = true;
111
112  try
113  {
114    job = transformation.getJob();
115  }
116  catch (PermissionDeniedException ex)
117  {
118    readJob = false;
119    readPlugin = false;
120    readConfiguration = false;
121  }
122  if (job != null)
123  {
124    try
125    {
126      plugin = job.getPluginDefinition();
127    }
128    catch (PermissionDeniedException ex)
129    {
130      readPlugin = false;
131    }
132    try
133    {
134      configuration = job.getPluginConfiguration();
135    }
136    catch (PermissionDeniedException ex)
137    {
138      readConfiguration = false;
139    }
140  }
141 
142  final boolean createPermission = experiment.hasPermission(Permission.USE);
143  final boolean writePermission = bioAssaySet.hasPermission(Permission.WRITE);
144  final boolean deletePermission = bioAssaySet.hasPermission(Permission.DELETE);
145  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
146  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
147  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioAssaySet);
148  ExtensionsInvoker toolbarInvoker = ToolbarUtil.useExtensions(jspContext);
149  ExtensionsInvoker overviewPlotInvoker = ExtensionsControl.useExtensions(jspContext, 
150      "net.sf.basedb.clients.web.bioassayset.overviewplots");
151  %>
152  <base:page title="<%=title%>">
153  <base:head scripts="table.js,tabcontrol.js,newjoust.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css,newjoust.css">
154    <ext:scripts context="<%=jspContext%>" />
155    <ext:stylesheets context="<%=jspContext%>" />
156    <script language="JavaScript">
157    function editItem()
158    {
159      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
160    }
161    function deleteItem()
162    {
163      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&experiment_id=<%=experimentId%>&item_id=<%=itemId%>');
164    }
165    function restoreItem()
166    {
167      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&experiment_id=<%=experimentId%>&item_id=<%=itemId%>');
168    }
169    function switchTab(tabControlId, tabId)
170    {
171      if (TabControl.isActive(tabControlId, tabId)) return;
172      if (tabId == 'bioassays')
173      {
174        location.href = '../bioassays/index.jsp?ID=<%=ID%>&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>&tab='+tabId;
175      }
176      else if (tabId == 'spotdata')
177      {
178        location.href = '../spotdata/index.jsp?ID=<%=ID%>&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>';
179      }
180      else if ((tabId == 'overviewplots' || tabId == 'cfplots') && tabId != '<%=tabId%>')
181      {
182        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>&tab='+tabId;
183      }
184      else
185      {
186        TabControl.setActiveTab(tabControlId, tabId);
187      }
188    }
189    function runItemPlugin(cmd)
190    {
191      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&experiment_id=<%=experimentId%>&item_id=<%=itemId%>', 'RunPlugin'+cmd, 750, 500);
192    }
193
194    function ImageQueue(baseId)
195    {
196      this.images = new Array();
197      this.nextImage = 0;
198
199      this.addImage = function(imageId, url)
200      {
201        this.images[this.images.length] = imageId;
202        var img = document.getElementById(imageId);
203        img.realSrc = url;
204      }
205
206      this.loadNextImage = function()
207      {
208        if (this.images.length <= this.nextImage) return;
209        var imageId = this.images[this.nextImage];
210        var img = document.getElementById(imageId);
211        img.src = '../../../images/plot_generating_400x300.gif';
212        img.realImg = new Image();
213        img.realImg.onload = function()
214        {
215          img.src = img.realImg.src;
216          img.style.background = 'transparent';
217          setTimeout('loadNextImage()', 100);
218        };
219        img.realImg.src = img.realSrc;
220        this.nextImage++;
221      }
222    }
223   
224    var plotQueue = new Array();
225    var currentQueue = null;
226    function registerImage(baseId, plotId, url)
227    {
228      if (!currentQueue) currentQueue = baseId;
229      var imageQueue = plotQueue[baseId];
230      if (!imageQueue)
231      {
232        imageQueue = new ImageQueue(baseId);
233        plotQueue[baseId] = imageQueue;
234      }
235      var imageId = baseId + '.' + plotId;
236      imageQueue.addImage(imageId, url);
237    }
238    function switchOverview(tabControlId, tabId)
239    {
240      currentQueue = tabId;
241      TabControl.setActiveTab(tabControlId, tabId);
242      loadNextImage();
243    }
244    function loadNextImage()
245    {
246      var imageQueue = plotQueue[currentQueue];
247      if (imageQueue) imageQueue.loadNextImage();
248    }
249    </script>
250    <style>
251    .plot
252    {
253      border: 1px solid #A0A0A0;
254      background-image: url('../../../images/plot_empty_400x300.png');
255      margin: 2px;
256    }
257    </style>
258  </base:head>
259  <base:body onload="loadNextImage()">
260    <p:path><p:pathelement 
261      title="Experiments" href="<%="../index.jsp?ID="+ID%>" 
262      /><p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
263        href="<%="index.jsp?ID="+ID+"&experiment_id="+experimentId%>" 
264      /><p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" 
265      /></p:path>
266   
267    <t:tabcontrol 
268      id="view" 
269      subclass="content mastertabcontrol"
270      active="<%=tabId%>" switch="switchTab" remember="false">
271    <t:tab id="properties" title="Properties">
272      <div>
273      <table class="fullform">
274      <tr>
275        <th class="itemstatus">
276          <base:icon 
277            image="deleted.gif"
278            onclick="deleteItemPermanently()"
279            tooltip="This item has been flagged for deletion. Click to delete it now."
280            enabled="<%=deletePermission %>"
281            visible="<%=bioAssaySet.isRemoved()%>" 
282          />
283        </th>
284        <td style="padding: 0px;" colspan="2">
285          <tbl:toolbar subclass="bottomborder">
286            <tbl:button 
287              disabled="<%=writePermission ? false : true%>" 
288              image="edit.gif" 
289              onclick="editItem()" 
290              title="Edit&hellip;" 
291              tooltip="<%=writePermission ? "Edit this bioassay set" : "You do not have permission to edit this bioassay set"%>" 
292            />
293            <tbl:button 
294              disabled="<%=deletePermission ? false : true%>" 
295              image="delete.gif" 
296              onclick="deleteItem()" 
297              title="Delete"
298              visible="<%=!bioAssaySet.isRemoved()%>"
299              tooltip="<%=deletePermission ? "Delete this bioassay set" : "You do not have permission to delete this bioassay set"%>" 
300            />
301            <tbl:button 
302              disabled="<%=writePermission ? false : true%>" 
303              image="restore.gif" 
304              onclick="restoreItem()" 
305              title="Restore"
306              visible="<%=bioAssaySet.isRemoved()%>"
307              tooltip="<%=writePermission ? "Restore this bioassay set" : "You do not have permission to restore this bioassay set"%>" 
308            />
309            <tbl:button 
310              image="import.gif" 
311              onclick="runItemPlugin('ImportItem')" 
312              title="Import&hellip;" 
313              tooltip="Import data" 
314              visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
315            />
316            <tbl:button 
317              image="export.gif" 
318              onclick="runItemPlugin('ExportItem')" 
319              title="Export&hellip;" 
320              tooltip="Export data" 
321              visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
322            />
323            <tbl:button
324              image="plotter.gif"
325              onclick="<%="openPlotTool(" + itemId + ")"%>"
326              title="Plot tool&hellip;"
327              tooltip="A simple tool for generating plots"
328              visible="<%=hasDbSpots%>"
329            />
330            <tbl:button
331              image="explorer.png"
332              onclick="<%="openExperimentExplorer(" + itemId + ")"%>"
333              title="Experiment explorer"
334              tooltip="View the data reporter by reporter"
335              visible="<%=hasDbSpots%>"
336            />
337            <tbl:button
338              disabled="<%=!createPermission%>"
339              image="filter.gif"
340              onclick="<%="filter(" + itemId +")"%>"
341              title="Filter bioassay set&hellip;"
342              tooltip="<%=createPermission ? 
343                "Create a new bioassay set by filtering this bioassayset" :
344                "You do not have permission analyze this experiment"%>"
345              visible="<%=pluginCount.containsKey(Plugin.MainType.ANALYZE)%>"
346            />
347            <tbl:button 
348              image="runplugin.gif" 
349              onclick="runItemPlugin('RunPlugin')"
350              title="Run plugin&hellip;" 
351              tooltip="Run a plugin" 
352              visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
353            />
354            <tbl:button 
355              disabled="<%=!createPermission%>"
356              image="<%=createPermission ? "runplugin.gif" : "runplugin_disabled.gif"%>" 
357              onclick="<%="runAnalysisPlugin(" + itemId + ")"%>"
358              title="Run analysis&hellip;" 
359              tooltip="<%=createPermission ? "Run an analysis plugin" : 
360                "You do not have permission to analyze this experiment"%>"
361              visible="<%=pluginCount.containsKey(Plugin.MainType.ANALYZE)%>"
362            />
363            <ext:render extensions="<%=toolbarInvoker%>" context="<%=jspContext%>" 
364              wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
365            <tbl:button
366              image="help.png"
367              onclick="<%="Main.openHelp('" + ID +"', 'bioassayset.view.properties')"%>"
368              title="Help&hellip;"
369              tooltip="Get help about this page"
370            />
371          </tbl:toolbar>
372        </td>
373      </tr>
374    </table>
375    <table style="width: 100%; height: 16em;" class="bottomborder">
376    <tr valign="top">
377      <td style="width: 50%; height: 100%;">
378      <table class="fullform" >
379      <tr>
380        <th>Name</th>
381        <td><%=HTML.encodeTags(bioAssaySet.getName())%></td>
382      </tr>
383      <tr>
384        <th>Experiment</th>
385        <td><%=Base.getLinkedName(ID, experiment, false, writePermission)%>
386        (<%=experiment.getRawDataType()%>)</td>
387      </tr>
388      <tr>
389        <th>Intensity transformation</th>
390        <td><%=bioAssaySet.getIntensityTransform().toString()%></td>
391      </tr>
392      <tr>
393        <th>Spots</th>
394        <td>db: <%=bioAssaySet.getNumSpots()%>; file: <%=bioAssaySet.getNumFileSpots()%></td>
395      </tr>
396      <tr>
397        <th>Reporters</th>
398        <td>db: <%=bioAssaySet.getNumReporters()%>; file: <%=bioAssaySet.getNumFileReporters()%></td>
399      </tr>
400      <tr>
401        <th>Permissions</th>
402        <td><%=PermissionUtil.getFullPermissionNames(bioAssaySet)%></td>
403      </tr>
404      <tr>
405        <th>Description</th>
406        <td><%=HTML.niceFormat(bioAssaySet.getDescription())%></td>
407      </tr>
408      <tbody class="sectionheader">
409        <tr>
410          <th colspan="2">Transformation &amp; job</th>
411        </tr>
412      </tbody>
413      <tr>
414        <th>Transformation</th>
415        <td><%=Base.getLinkedName(ID, transformation, false, 
416            transformation.hasPermission(Permission.WRITE))%></td>
417      </tr>
418      <tr>
419        <th>Job</th>
420        <td><%=Base.getLinkedName(ID, job, !readJob, false)%></td>
421      </tr>
422      <tr >
423        <th>Started</th>
424        <td>
425          <%=job == null ? "" : dateTimeFormatter.format(job.getStarted())%>
426        </td>
427      </tr>
428      <tr>
429        <th>Ended</th>
430        <td>
431          <%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%>
432        </td>
433      </tr>
434      <tr>
435        <th>Server</th>
436        <td>
437          <%=job == null ? "" : HTML.encodeTags(job.getServer())%>
438        </td>
439      </tr>
440      <tr>
441        <th>Description</th>
442        <td><%=HTML.niceFormat(transformation.getDescription())%></td>
443      </tr>
444      </table>
445    </td>
446    <td style="width: 50%;" class="leftborder">
447      <table class="fullform" >
448      <tbody class="sectionheader">
449        <tr>
450          <th colspan="2">Plugin &amp; parameters</th>
451        </tr>
452      </tbody>
453      <tr>
454        <th>Plugin</th>
455        <td><%=Base.getLinkedName(ID, plugin, 
456            !readPlugin, plugin != null && plugin.hasPermission(Permission.WRITE))%></td>
457      </tr>
458      <tr>
459        <th>Plugin configuration</th>
460        <td><%=Base.getLinkedName(ID, configuration, !readConfiguration, 
461          configuration != null && configuration.hasPermission(Permission.WRITE))%></td>
462      </tr>
463        <%
464        if (job != null)
465        {
466          for (String name : job.getParameterNames())
467          {
468            StringBuilder sb = new StringBuilder();
469            String displayValue = "";
470            String description = "";
471            try
472            {
473              ParameterInfo pi = job.getParameterInfo(name);
474              if (pi.getLabel() != null) name = HTML.encodeTags(pi.getLabel());
475              description = HTML.encodeTags(pi.getDescription());
476              List<?> values = pi.getValues();
477              int i = 0;
478              for (Object value : values)
479              {
480                if (value != null)
481                {
482                  if (i > 0) sb.append(", ");
483                  i++;
484                  if (value instanceof BasicItem)
485                  {
486                    BasicItem item = (BasicItem)value;
487                    String itemName = "";
488                    if (item instanceof File)
489                    {
490                      itemName = ((File)item).getPath().toString();
491                    }
492                    else if (item instanceof Nameable)
493                    {
494                      itemName = ((Nameable)item).getName();
495                    }
496                    else
497                    {
498                      itemName = item.toString();
499                    }
500                    sb.append(Base.getLink(ID, HTML.encodeTags(itemName), 
501                      item.getType(), item.getId(), item.hasPermission(Permission.WRITE)));
502                  }
503                  else if (value instanceof Date)
504                  {
505                    sb.append(dateFormatter.format((Date)value));
506                  }
507                  else
508                  {
509                    sb.append(HTML.encodeTags(value.toString()));
510                  }
511                }
512              }
513              displayValue = sb.toString();
514            }
515            catch (Throwable ex)
516            {
517              displayValue = "<i>ERROR: "+ex.getMessage()+"</i>";
518            }
519            %>
520            <tr>
521            <th><span title="<%=description%>"><%=name%></span></th>
522              <td>
523                <%=displayValue%>
524              </td>
525            </tr>
526            <%
527          }
528        }
529        %>
530        <tr class="dynamic">
531          <th></th>
532          <td></td>
533        </tr>
534        </table>
535
536      </td>
537      </tr>
538      </table>
539      </div>
540      <jsp:include page="../../../common/datafiles/list_files.jsp">
541        <jsp:param name="item_type" value="<%=itemType.name()%>" />
542        <jsp:param name="item_id" value="<%=itemId%>" />
543        <jsp:param name="ID" value="<%=ID%>" />
544      </jsp:include>
545     
546      <jsp:include page="../../../common/anytoany/list_anytoany.jsp">
547        <jsp:param name="ID" value="<%=ID%>" />
548        <jsp:param name="item_type" value="<%=itemType.name()%>" />
549        <jsp:param name="item_id" value="<%=itemId%>" />
550        <jsp:param name="title" value="Other items related to this bioassay set" />
551      </jsp:include>
552     
553      <base:section id="anaysis" title="Analysis subtree" context="<%=cc%>">
554        <jsp:include page="analysis_tree.jsp">
555          <jsp:param name="ID" value="<%=ID%>" />
556          <jsp:param name="experiment_id" value="<%=experimentId%>" />
557          <jsp:param name="item_id" value="<%=itemId%>" />
558        </jsp:include>
559      </base:section>
560      </t:tab>
561     
562      <t:tab id="annotations" title="Annotations" 
563        tooltip="View annotation values" clazz="white">
564        <jsp:include page="../../../common/annotations/list_annotations.jsp">
565          <jsp:param name="item_type" value="<%=itemType.name()%>" />
566          <jsp:param name="item_id" value="<%=itemId%>" />
567          <jsp:param name="ID" value="<%=ID%>" />
568        </jsp:include>
569      </t:tab>
570     
571      <t:tab id="bioassays" title="Bioassays" />
572     
573      <t:tab id="spotdata" title="Spot data" 
574        visible="<%=hasDbSpots%>" />
575     
576      <t:tab id="overviewplots" title="Overview plots" 
577        tooltip="Predefined plots for all bioassays in this bioassay set"
578        visible="<%=overviewPlotInvoker.getNumExtensions() > 0%>">
579        <%
580        if ("overviewplots".equals(tabId))
581        {
582          ActionIterator<OverviewPlotAction> plots = overviewPlotInvoker.iterate();
583          StringBuilder script = new StringBuilder();
584          %>
585          <t:tabcontrol id="overviewplots" switch="switchOverview">
586          <% 
587          while (plots.hasNext())
588          {
589            OverviewPlotAction action = plots.next();
590            String baseId = plots.getExtension().getId() + "." + action.getId();
591            %>
592            <t:tab 
593              tooltip="<%=action.getDescription() %>"
594              title="<%=action.getTitle()%>"
595              id="<%=baseId%>"
596              >
597              <%
598              for (PlotGenerator generator : action.getPlotGenerators())
599              {
600                String plotId = generator.getId();
601                script.append("registerImage('").append(baseId).append("','")
602                    .append(plotId).append("','")
603                    .append(HTML.javaScriptEncode(generator.getUrl())).append("');\n");
604                %><img id="<%=baseId + "." + plotId%>"
605                  class="plot"
606                  src="../../../images/transparent_pixel.gif"
607                  width="<%=generator.getWidth()%>"
608                  height="<%=generator.getHeight()%>"
609                  alt="<%=HTML.encodeTags(generator.getTitle())%>"
610                >&#8203;&#8203;<%
611              }
612              %>
613            </t:tab>
614            <%
615          }
616          %>
617          </t:tabcontrol>
618          <script language="JavaScript">
619          <%=script%>
620          </script>
621          <%
622        }
623        %>
624      </t:tab>
625      </t:tabcontrol>
626
627  </base:body>
628  </base:page>
629  <%
630}
631finally
632{
633  if (dc != null) dc.close();
634}
635
636%>
Note: See TracBrowser for help on using the repository browser.