source: extensions/net.sf.basedb.reggie/trunk/resources/libprep/assign_barcode.jsp @ 1938

Last change on this file since 1938 was 1938, checked in by Nicklas Nordborg, 9 years ago

References #424: Select RNA items for library preparation

Add support for selecting 'Stratagene' when designing a new mRNA plate.

File size: 20.8 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.User"
5  import="net.sf.basedb.core.DbControl"
6  import="net.sf.basedb.core.SessionControl"
7  import="net.sf.basedb.core.Application"
8  import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
9  import="net.sf.basedb.clients.web.Base" 
10  import="net.sf.basedb.clients.web.util.HTML" 
11  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
12%>
13<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
14<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
15<%
16final SessionControl sc = Base.getExistingSessionControl(request, true);
17final String ID = sc.getId();
18final float scale = Base.getScale(sc);
19final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.reggie");
20DbControl dc = null;
21try
22{
23  dc = sc.newDbControl();
24  final User user = User.getById(dc, sc.getLoggedInUserId());
25%>
26<base:page type="default" >
27<base:head scripts="ajax.js" styles="path.css">
28  <link rel="stylesheet" type="text/css" href="../css/reggie.css">
29  <link rel="stylesheet" type="text/css" href="../css/plate.css">
30  <script language="JavaScript" src="../reggie.js" type="text/javascript" charset="UTF-8"></script>
31  <script language="JavaScript" src="pools.js" type="text/javascript" charset="UTF-8"></script>
32  <script language="JavaScript" src="plate.js" type="text/javascript" charset="UTF-8"></script>
33
34<script language="JavaScript">
35var debug = false;
36var currentStep = 1;
37
38var cdnaDateIsValid = false;
39var barcodesByName = [];
40
41function init()
42{
43  var frm = document.forms['reggie'];
44
45  var barcodes = loadBarcodes();
46  var selectBarcodeHtml = '';
47 
48  for (var i = 0; i < barcodes.length; i++)
49  {
50    if (i % 8 == 0 && i > 0)
51    {
52      selectBarcodeHtml += '<div class="menuseparator"></div>';
53    }
54    var barcode = barcodes[i];
55    barcodesByName[barcode.name] = barcode;
56    selectBarcodeHtml += '<div class="menuitem enabled" id="bc-'+barcode.id+'" data-barcode-name="'+barcode.name+'">';
57    selectBarcodeHtml += barcode.name+'</div>';
58  }
59  setInnerHTML('select-barcode-all', selectBarcodeHtml);
60 
61  // Load existing cDNA plates that have not yet been assigned barcodes
62  var bioplates = getCDnaBioPlatesForBarcode();
63  var plates = frm.bioplate;
64  if (bioplates != null && bioplates.length > 0)
65  {
66    for (var i=0; i < bioplates.length; i++)
67    {
68      var bioplate = bioplates[i];
69      var option = new Option(bioplate.name, bioplate.id);
70      option.bioplate = bioplate;
71      plates.options[plates.length] = option;
72    }
73    bioplateIsValid = true;
74    setInputStatus('bioplate', '', 'valid');
75    bioPlateOnChange();
76  }
77  else
78  {
79    var msg = 'No cDNA bioplates available for processing.';
80    setFatalError(msg);
81    return;
82  }
83
84  Main.show('gonext');
85}
86
87function getCDnaBioPlatesForBarcode()
88{
89  var frm = document.forms['reggie']; 
90 
91  var request = Ajax.getXmlHttpRequest();
92  try
93  {
94    showLoadingAnimation('Loading cDNA bioplates ...');
95    var url = '../LibPrep.servlet?ID=<%=ID%>&cmd=GetCDNAPlatesForBarcoding';   
96    request.open("GET", url, false); 
97    request.send(null);
98  }
99  finally
100  {
101    hideLoadingAnimation();
102  }
103 
104  if (debug) Main.debug(request.responseText);
105  var response = JSON.parse(request.responseText); 
106  if (response.status != 'ok')
107  {
108    setFatalError(response.message);
109    return false;
110  }
111  return response.bioplates;
112}
113
114function bioPlateOnChange()
115{
116  var frm = document.forms['reggie'];
117  var bioplate = frm.bioplate[frm.bioplate.selectedIndex].bioplate;
118  setInnerHTML('cdnacomments', formatText(bioplate.comments));
119}
120
121
122function loadBarcodes()
123{
124  var request = Ajax.getXmlHttpRequest();
125  try
126  {
127    showLoadingAnimation('Loading barcode information...');
128    var url = '../LibPrep.servlet?ID=<%=ID%>&cmd=GetAllBarcodeInfo';   
129    request.open("GET", url, false); 
130    request.send(null);
131  }
132  finally
133  {
134    hideLoadingAnimation();
135  }
136 
137  if (debug) Main.debug(request.responseText);
138  var response = JSON.parse(request.responseText); 
139  if (response.status != 'ok')
140  {
141    setFatalError(response.message);
142    return false;
143  }
144 
145  return response.barcodes;
146}
147
148function goNext(manual)
149{
150  setInnerHTML('gonext.message', '');
151  if (currentStep == 1)
152  {   
153    gotoStep2();
154  }
155  setCurrentStep(currentStep);
156}
157
158function gotoStep2()
159{
160  var frm = document.forms['reggie'];
161  frm.bioplate.disabled = true;
162 
163  Main.addClass(document.getElementById('step.1.section'), 'disabled');
164  Main.hide('gonext');
165  Main.hide('gocancel');
166  loadCDNAInformation();
167 
168  currentStep = 2;
169  document.getElementById('step.2.section').style.display = 'table';
170  Main.show('gocancel');
171  Main.show('gocreate');
172 
173  keepSessionAlive('<%=ID%>', debug, '../');
174}
175
176function loadCDNAInformation()
177{
178  // Load cDNA and related info from the selected bioplate
179 
180  var frm = document.forms['reggie'];
181  var cdnaPlate = frm.bioplate[frm.bioplate.selectedIndex].bioplate;
182
183  var schema = PoolSchema.getById(cdnaPlate.poolSchema);
184  PoolSchema.initList(frm.pool_schema, schema.id);
185  PoolSchema.initVariantList(frm.barcode_variant, schema, cdnaPlate.barcodeVariant);
186
187  var request = Ajax.getXmlHttpRequest();
188  try
189  {
190    showLoadingAnimation('Loading cDNA bioplate information...');
191    var url = '../LibPrep.servlet?ID=<%=ID%>&cmd=GetCDnaInfoForPlate&bioplate='+cdnaPlate.id;   
192    request.open("GET", url, false); 
193    request.send(null);
194  }
195  finally
196  {
197    hideLoadingAnimation();
198  }
199 
200  if (debug) Main.debug(request.responseText);
201  var response = JSON.parse(request.responseText);
202  if (response.status != 'ok')
203  {
204    setFatalError(response.message);
205    return false;
206  }
207 
208  var list = response.cdna;
209  // Pre-process the return cDNA items
210  for (var i = 0; i < list.length; i++)
211  {
212    checkAndPreProcessCDna(list[i]);
213  }
214 
215  viewAsPlate(list, schema); 
216}
217
218
219/**
220  Check the mRNA and RNA items for problems and calculate derived
221  information such as volume and water, qc/stratagene flags.
222*/
223function checkAndPreProcessCDna(cdna)
224{
225  // Set the 'stratagene'/'external' flag
226  cdna.stratagene = cdna.name.indexOf(GENERIC_STRATAGENE_NAME) == 0;
227  cdna.external = cdna.name.indexOf(EXTERNAL_RNA_NAME) == 0;
228}
229
230function viewAsPlate(list, schema)
231{
232  Plate.init(8, 12, schema, WellPainter);
233
234  for (var i = 0; i < list.length; i++)
235  {
236    var cdna = list[i];
237    var well = cdna.bioWell;
238    Plate.getWell(well.row, well.column).setExtract(cdna);
239  }
240  var frm = document.forms['reggie'];
241 
242  var barcodeVariant = schema.barcodeVariants[frm.barcode_variant.selectedIndex];
243  assignSchemaDefinedBarcodeVariant(schema, barcodeVariant);
244 
245  WellPainter.barcodeVariant = barcodeVariant;
246  Plate.paint(Plate.getWells());
247  PoolSchema.buildPoolTableRow(schema, 12, false);
248}
249
250function assignSchemaDefinedBarcodeVariant(schema, barcodeVariant)
251{
252  var wells = Plate.getWells();
253  for (var i = 0; i < wells.length; i++)
254  {
255    var well = wells[i];
256    var cdna = well.extract;
257    if (cdna)
258    {
259      var indexSet = barcodeVariant.indexSets[well.column];
260      var barcode = null;
261      if (indexSet)
262      {
263        var barcodeName = indexSet.barcodes[well.row];
264        barcode = barcodesByName[barcodeName];
265      }
266      cdna.barcode = barcode;
267      cdna.defaultBarcode = barcode;
268      well.duplicate = false;
269    }
270  }
271}
272
273
274function poolSchemaOnChange()
275{
276  var frm = document.forms['reggie'];
277  var schema = POOL_SCHEMA[frm.pool_schema.selectedIndex];
278  Plate.setPoolSchema(schema);
279  PoolSchema.initVariantList(frm.barcode_variant, schema);
280 
281  var barcodeVariant = schema.barcodeVariants[frm.barcode_variant.selectedIndex];
282  assignSchemaDefinedBarcodeVariant(schema, barcodeVariant);
283 
284  WellPainter.barcodeVariant = barcodeVariant;
285  Plate.paint(Plate.getWells());
286  PoolSchema.buildPoolTableRow(schema, 12, false);
287}
288
289function barcodeVariantOnChange()
290{
291  var frm = document.forms['reggie'];
292  var schema = POOL_SCHEMA[frm.pool_schema.selectedIndex];
293  var barcodeVariant = schema.barcodeVariants[frm.barcode_variant.selectedIndex]; 
294 
295  assignSchemaDefinedBarcodeVariant(schema, barcodeVariant);
296
297  WellPainter.barcodeVariant = barcodeVariant;
298  Plate.paint(Plate.getWells());
299}
300
301
302
303function goCreate()
304{
305  var submitInfo = {};
306  var plateInfo = {};
307 
308  submitInfo.bioplate = plateInfo;
309  var frm = document.forms['reggie'];
310   
311  plateInfo.id = parseInt(frm.bioplate.value);
312  plateInfo.poolSchema = frm.pool_schema.value;
313  plateInfo.barcodeVariant = frm.barcode_variant.value;
314  plateInfo.comments = frm.comments.value;
315  plateInfo.wells = [];
316
317  var wells = Plate.getWells();
318  var numErrors = 0;
319  var numWarnings = 0;
320  var numCdna = 0;
321  for (var i = 0; i < wells.length; i++)
322  {
323    var well = wells[i];
324    if (well.hasWarning())
325    {
326      numWarnings++;
327    }
328    if (well.hasError())
329    {
330      numErrors++;
331    }
332    else
333    {
334      if (well.extract && well.extract.id)
335      {
336        var tmp = {};
337        tmp.row = well.row;
338        tmp.column = well.column;
339        tmp.cdna = {};
340        tmp.cdna.id = well.extract.id;
341        tmp.cdna.barcode = {};
342        tmp.cdna.barcode.id = well.extract.barcode.id;
343        plateInfo.wells[plateInfo.wells.length] = tmp;
344        numCdna++;
345      }
346    }
347  }
348
349  if (numErrors > 0)
350  {
351    alert('There are ' + numErrors + ' wells with errors. Please fix them before continuing.');
352    return;
353  }
354
355  if (numCdna == 0)
356  {
357    alert('There is no cDNA in any wells');
358    return;
359  }
360 
361  if (numWarnings > 0)
362  {
363    if (!confirm('There are ' + numWarnings + ' wells with a warning. Continue anyway?')) return;
364  }
365 
366
367  Main.addClass(document.getElementById('step.2.section'), 'disabled');
368  Main.hide('gocancel');
369  Main.hide('gocreate');
370
371  if (debug) Main.debug(JSON.stringify(submitInfo));
372
373  var request = Ajax.getXmlHttpRequest();
374  var url = '../LibPrep.servlet?ID=<%=ID%>';
375  url += '&cmd=CreateBarcodedLibraries';
376  try
377  {
378    showLoadingAnimation('Registering barcoded libraries...');
379    request.open("POST", url, false);
380    request.setRequestHeader("Content-Type", "application/json");
381    request.send(JSON.stringify(submitInfo));
382  }
383  finally
384  {
385    hideLoadingAnimation();
386  }
387
388  if (debug) Main.debug(request.responseText);
389
390  var response = JSON.parse(request.responseText);
391  if (response.status != 'ok')
392  {
393    setFatalError(response.message);
394    return false;
395  }
396
397  var msg = '<ul>';
398  for (var i = 0; i < response.messages.length; i++)
399  {
400    msg += '<li>' + response.messages[i];
401  }
402  msg += '</ul>';
403  setInnerHTML('done', msg);
404  Main.show('done');
405  Main.show('gorestart');
406}
407
408var currentWell;
409var lastSelectedBarcode;
410function selectBarcode(event, row, column)
411{
412  // Locate the barcode selection div so that the current
413  // barcode is positioned next to the current mouse position
414  // Initially set it to the right of the mouse so that the
415  // center is vertically aligned
416 
417  currentWell = Plate.getWell(row, column);
418  var cdna = currentWell.extract;
419  var scroll = 0;
420  if (cdna)
421  {
422    // Reset 'current' selection
423    var menu = document.getElementById('select-barcode');
424    var selectAll = document.getElementById('select-barcode-all');
425    for (var i = 0; i <  selectAll.childNodes.length; i++)
426    {
427      Main.removeClass(selectAll.childNodes[i], 'current');
428    }
429    menu.style.display = 'block';
430
431    var x = event.clientX+1;
432    var halfHeight = Math.floor(selectAll.offsetHeight/2)
433    var y = event.clientY-halfHeight;
434    var scroll = 0;
435    var barcodeDiv;
436   
437    var useBarcode = cdna.barcode || lastSelectedBarcode;
438    if (useBarcode)
439    {
440      var barcodeDiv = document.getElementById('bc-'+useBarcode.id);
441      if (!cdna.barcode && barcodeDiv.nextSibling) barcodeDiv = barcodeDiv.nextSibling;
442      // Try to scroll the current barcode so that it's baseline is at the center of the div
443      scroll = barcodeDiv.offsetTop + barcodeDiv.offsetHeight - halfHeight;
444      if (scroll < 0) 
445      {
446        // We get a negative scroll for the first few elements, shift the
447        // entire selection div down instead
448        y -= scroll;
449        scroll = 0;
450      }
451      else if (scroll > selectAll.scrollHeight - selectAll.offsetHeight)
452      {
453        // We get a too large scroll value for the last few elements, shift
454        // the entire selection div up instead
455        y -= scroll - (selectAll.scrollHeight - selectAll.offsetHeight);
456        scroll = selectAll.scrollHeight - selectAll.offsetHeight;
457      }
458      if (cdna.barcode)
459      {
460        Main.addClass(barcodeDiv, 'current');
461      }
462    }
463   
464    // Default barcode
465    if (cdna.defaultBarcode && cdna.defaultBarcode != cdna.barcode)
466    {
467      var selectDefault = document.getElementById('select-barcode-default');
468      selectDefault.setAttribute('data-barcode-name', cdna.defaultBarcode.name);
469      selectDefault.innerHTML = 'Default: ' + cdna.defaultBarcode.name;
470      Main.show('select-barcode-default');
471      Main.show('select-barcode-default-separator');
472    }
473    else
474    {
475      Main.hide('select-barcode-default');
476      Main.hide('select-barcode-default-separator');
477    }
478   
479    // Position the selection div
480    selectAll.scrollTop = scroll;
481    menu.style.left = (x)+'px';
482    menu.style.top = (y)+'px';
483    event.stopPropagation();
484  }
485 
486}
487
488function barcodeSelected(event)
489{
490  var frm = document.forms['reggie'];
491  var schema = POOL_SCHEMA[frm.pool_schema.selectedIndex];
492  var target = event.target;
493  if (currentWell && currentWell.extract)
494  {
495    lastSelectedBarcode = barcodesByName[target.getAttribute('data-barcode-name')];
496    currentWell.extract.barcode = lastSelectedBarcode;
497    var poolNum = schema.getPoolNumForColumn(currentWell.column);
498    if (poolNum >= 0)
499    {
500      checkDuplicateBarcode(poolNum);
501      Plate.paint(schema.getWellsInPool(Plate, poolNum));
502    }
503    else
504    {
505      Plate.paint([currentWell]);
506    }
507  }
508}
509
510function checkDuplicateBarcode(poolNum)
511{
512  var frm = document.forms['reggie'];
513  var schema = POOL_SCHEMA[frm.pool_schema.selectedIndex];
514
515  var wells = schema.getWellsInPool(Plate, poolNum);
516  var wellByBarcodeName = [];
517  for (var i = 0; i < wells.length; i++)
518  {
519    var well = wells[i];
520    var cdna = well.extract;
521    if (cdna && cdna.barcode)
522    {
523      if (wellByBarcodeName[cdna.barcode.name])
524      {
525        well.duplicate = true;
526        wellByBarcodeName[cdna.barcode.name].duplicate = true;
527      }
528      else
529      {
530        wellByBarcodeName[cdna.barcode.name] = well;
531        well.duplicate = false;
532      }
533    }
534  }
535}
536
537
538var WellPainter = function()
539{
540  var painter = {};
541 
542  painter.getClassNameForWell = function(well, schema)
543  {
544    var cls = '';
545    var indexSet = painter.barcodeVariant.indexSets[well.column];
546    if (indexSet)
547    {
548      cls += indexSet.color;
549    }
550    var cdna = well.extract;
551    if (cdna && cdna.barcode)
552    {
553      if (cdna.defaultBarcode && cdna.barcode != cdna.defaultBarcode)
554      {
555        cls += ' bg-modified';
556      }
557    }
558    if (well.duplicate)
559    {
560      cls += ' duplicate';
561    }
562    return cls;
563  }
564 
565  painter.getWellText = function(well, schema)
566  {
567    var text = '';
568    var cdna = well.extract;
569    if (cdna)
570    {
571      var name = cdna.name;
572      var i = name.indexOf('.m');
573      text += '<div class="name">'+name.substring(0, i)+'.<br>&nbsp;'+name.substring(i)+'</div>';
574      if (cdna.barcode)
575      {
576        text += '<div class="barcode">'+cdna.barcode.name+'</div>';
577        if (cdna.defaultBarcode && cdna.barcode != cdna.defaultBarcode)
578        {
579          text += '<div class="warn-msg">Modified barcode</div>';
580        }
581      }
582      else
583      {
584        well.setError('No barcode');
585      }
586    }
587    if (well.duplicate)
588    {
589      well.setError('Duplicate barcode');
590    }
591    return text;
592  }
593
594  return painter;
595}();
596
597</script>
598<style>
599
600/* A well assigned for QC include a background icon as indicator */
601.well.qc
602{
603  background-image: url('../images/mrnaqc.png');
604  background-position: 95% 25%;
605  background-repeat: no-repeat;
606}
607
608
609#select-barcode-all
610{
611  max-height: 20em;
612  overflow: auto;
613}
614
615#select-barcode .menuitem
616{
617  padding-left: 16px;
618}
619
620#select-barcode div.current
621{
622  font-weight: bold;
623  background-image: url('../images/selected.gif');
624  background-position: 2px 50%;
625  background-repeat: no-repeat;
626}
627
628#select-barcode .menuitem:hover
629{
630  padding-left: 14px;
631  background-position: 0px 50%;
632}
633
634.menuseparator
635{
636  width: auto !important;
637}
638
639</style>
640</base:head>
641<base:body onload="init()">
642
643  <p:path><p:pathelement 
644    title="Reggie" href="<%="../index.jsp?ID="+ID%>" 
645    /><p:pathelement title="Assign barcodes to cDNA plates" 
646    /></p:path>
647
648  <div class="content" onclick="Main.hide('select-barcode')">
649  <%
650  if (sc.getActiveProjectId() == 0)
651  {
652    %>
653    <div class="messagecontainer note" style="width: 950px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
654      No project has been selected. You may proceed with the registration but
655      created items will not be shared.
656    </div>
657    <%
658  }
659  %>
660
661  <div id="select-barcode" class="menu vertical" style="width: 150px; display: none;"
662    onclick="barcodeSelected(event)"
663    >
664    <div class="menuitem enabled" id="select-barcode-default">Default</div>
665    <div class="menuseparator" id="select-barcode-default-separator"></div>
666    <div id="select-barcode-all"></div>
667  </div>
668
669  <form name="reggie" onsubmit="return false;">
670 
671  <table id="step.1.section" class="stepform" style="width: auto;">
672  <tr>
673    <td rowspan="3" class="stepno">1</td>
674    <td class="steptitle">Select cDNA bioplate</td>
675  </tr>
676  <tr>
677    <td class="stepfields">
678      <table>
679      <tr valign="top">
680        <td class="prompt">cDNA bioplate</td>
681        <td class="input"><select class="required" style="width:90%" 
682            name="bioplate" id="bioplate"></select>
683          <div id="cdnacomments" style="font-style: italic; background: #E8E8E8; padding: 2px 5px 2px 5px;"></div>
684        </td>
685        <td class="status" id="bioplate.status"></td>
686        <td class="help"><span id="bioplate.message" class="message" style="display: none;"></span>
687          Select an existing cDNA bioplate. The list contain all cDNA bioplates that
688          has not yet been assigned barcodes (determined by the absence of 'BarcodeVariant'
689          annotation).
690        </td>
691      </tr>
692      </table>
693    </td>
694  </tr>
695  </table>
696 
697  <table id="step.2.section" class="stepform" style="display: none; width: auto;">
698  <tr>
699    <td rowspan="2" class="stepno">2</td>
700    <td class="steptitle">Select barcodes</td>
701  </tr>
702  <tr>
703    <td class="stepfields">
704
705      <table class="bottomborder" style="width: 100%;">
706      <tr valign="top">
707        <td class="prompt">Pool layout</td>
708        <td class="input">
709          <select name="pool_schema" onchange="poolSchemaOnChange()"></select>
710        </td>
711        <td class="help"></td>
712      </tr>
713      <tr valign="top">
714        <td class="prompt">Barcode variants</td>
715        <td class="input">
716          <select name="barcode_variant" onchange="barcodeVariantOnChange()"></select>
717        </td>
718        <td class="help"></td>
719      </tr>
720      <tr valign="top">
721        <td class="prompt">Comments</td>
722        <td class="input">
723          <textarea rows="2" style="width: 90%;" name="comments" value=""></textarea>
724        </td>
725        <td class="help">Comments for the library preparation.</td>
726      </tr>
727      </table>
728     
729      <table class="plate" style="margin: 1em 1em 1em 1em;" id="plate">
730      <%
731      int columns = 12;
732      int rows = 8;
733      WellCoordinateFormatter rowF = new WellCoordinateFormatter(true);
734      WellCoordinateFormatter colF = new WellCoordinateFormatter(false);
735      %>
736      <tr class="header">
737        <th></th>
738        <%
739        for (int c = 0; c < columns; ++c)
740        {
741          %>
742          <th id="col.<%=c%>"><%=colF.format(c)%></th>
743          <%
744        }
745        %>
746      </tr>
747      <tbody>
748      <%
749      for (int r = 0; r < rows; ++r)
750      {
751        String row = rowF.format(r);
752        %>
753        <tr class="row-<%=r%>">
754          <th id="row.<%=r%>" class="rowheader"><%=row%></th>
755          <%
756          for (int c = 0; c < columns; ++c)
757          {
758            %>
759            <td class="well col-<%=c%>" id="well.<%=r%>.<%=c%>"
760              onclick="selectBarcode(event, <%=r%>,<%=c%>)"
761              title="Click to select barcode for this well"
762              ></td>
763            <%
764          }
765          %>
766        </tr>
767        <%
768      }
769      %>
770      </tbody>
771      <tr id="pool-row">
772        <th colspan="13">&nbsp;</th>
773      </tr>
774      </table>
775    </td>
776  </tr>
777  </table>
778 
779 
780  <div class="loading" id="loading" style="display: none;"><table><tr><td><img src="../images/loading.gif"></td><td id="loading.msg">Please wait...</td></tr></table></div>
781 
782  <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>
783 
784  <div id="done" class="success" style="display: none; width: 950px; margin-left: 20px; margin-top: 20px;"></div>
785 
786  <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
787    <tr>
788      <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" /></td>
789      <td><base:button id="gonext" title="Next" image="<%=home+"/images/gonext.png"%>" onclick="goNext(true)"/></td>
790      <td><base:button id="gocreate" title="Create" image="<%=home+"/images/gonext.png"%>" onclick="goCreate()" style="display: none;"/></td>
791      <td><base:button id="gorestart" title="Restart" image="<%=home+"/images/goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
792      <td id="gonext.message" class="message"></td>
793    </tr>
794  </table>
795 
796  </form>
797  </div>
798 
799</base:body>
800</base:page>
801<%
802}
803finally
804{
805  if (dc != null) dc.close();
806}
807%>
Note: See TracBrowser for help on using the repository browser.