Index: lib/style/common/templates/entryForm.tmpl
===================================================================
--- lib/style/common/templates/entryForm.tmpl	(revision 1983)
+++ lib/style/common/templates/entryForm.tmpl	(revision 1984)
@@ -12,6 +12,40 @@
         var parent = addParaButton.parentNode;
         parent.insertBefore(newParaContainer, addParaButton);
     }
+
+    function addTaxon() {
+        var taxaCountField = document.getElementById("taxaCount");
+        var taxaCount = taxaCountField.getAttribute("value");
+        taxaCount++;
+        taxaCountField.setAttribute("value", taxaCount);
+        var taxonRow = createTaxonRow(taxaCount);
+        var taxonRowMarker = document.getElementById("addtaxarow");
+        var parent = taxonRowMarker.parentNode;
+        parent.insertBefore(taxonRow, taxonRowMarker);
+    }
+
+    function createTaxonRow(taxaCount) {
+        var rankField=createTextField("taxonRankName" + taxaCount, "25");
+        var rankCell = document.createElement("td");
+        rankCell.appendChild(rankField);
+        var taxonField=createTextField("taxonRankValue" + taxaCount, "25");
+        var taxonCell = document.createElement("td");
+        taxonCell.appendChild(taxonField);
+        var taxonRow = document.createElement("tr");
+        taxonRow.appendChild(rankCell);
+        taxonRow.appendChild(taxonCell);
+
+        return taxonRow;
+    }
+
+    function createTextField(name, size) {
+        var newField=document.createElement("input");
+        newField.setAttribute("type", "text"); 
+        newField.setAttribute("name", name); 
+        newField.setAttribute("size", size); 
+
+        return newField;
+    }
   </script>
 
 [% IF cfg == 'nrs' %]
@@ -1021,69 +1055,65 @@
       </td>
     </tr>
   </table>
-  <br>
-  <p align="left"><font size="4" color="0000ff"><b><font size="-1">
-  <a
-   href="@cgi-prefix@/register-dataset.cgi?cfg=[%cfg%]&amp;stage=guide#SpatialCoverageOfData"
-   target="guide">SPATIAL COVERAGE OF DATA</a>
-	</font></b></font> 
+
+  <p align="left">
+  <a href="@cgi-prefix@/register-dataset.cgi?cfg=[%cfg%]&amp;stage=guide#SpatialCoverageOfData" target="guide">SPATIAL COVERAGE OF DATA</a>
+  </p>
   <table cellspacing="0" border="0" cellpadding="9" width="760"
 bgcolor="#c6d6e7">
     <tr>
     <td valign="top" colspan="4">
     <span class="required">*</span><span class="label">Geographic Description</span><br>
-    <textarea rows="3" columns="80" name="geogdesc">[% geogdesc %]</textarea>
+    <textarea rows="3" cols="80" name="geogdesc">[% geogdesc %]</textarea>
     </td>
     </tr>
     <tr> 
       <td valign="TOP" colspan="4"> 
-        <p><font size="-1"><b>Coordinates (in Degrees, Minutes and Seconds; at 
-          least 1 lat./long. pair is required):</b></font></p>
+        <p class="label">Coordinates (in Degrees, Minutes and Seconds; at 
+          least 1 lat./long. pair is required):</p>
       </td>
     </tr>
     <tr> 
       <td valign="TOP" colspan="4"> 
-        <p><font size="-1"><b>Enter the first lat./long. pair only to indicate 
-          a point location. Enter both coordinate pairs to indicate a bounding 
-          box. In case of a bounding box, the first coordinate pair is the northwest 
-          corner and the second coordinate pair is the southeast corner of the 
-          bounding box.</b></font></p>
+        <p>Enter the first lat./long. pair only to indicate 
+          a point location. Enter both coordinate pairs to indicate a bounding
+          box. In case of a bounding box, the first coordinate pair is the
+          northwest corner and the second coordinate pair is the southeast
+          corner of the bounding box.</p>
       </td>
     </tr>
 [% IF showSiteList == 'true' %]
-    <tr> 
-      <td valign="TOP" colspan="4" class="tablepanel"><font size="-1" color="#ff0000"> 
-        <input
-type="CHECKBOX" name="useSiteCoord" [%useSiteCoord%]>
-        Use [% lsite %] coordinates. (This indicates that the data were collected 
-        at the [% lsite %]. If you check this box, you don't need to fill in the lat./long. 
-        fields below).</font> </td>
+    <tr>
+      <td valign="TOP" colspan="4" class="tablepanel">
+        <input class="required"
+        type="CHECKBOX" name="useSiteCoord" [%useSiteCoord%]>
+        Use [% lsite %] coordinates. (This indicates that the data were
+        collected at the [% lsite %]. If you check this box, you don't need
+        to fill in the lat./long. fields below).
+        </td>
     </tr>
 [% END %]
     <tr> 
       <td width="18%" valign="TOP"> 
-        <p><font size="-1"><b><font color="#ff0000">*</font>Latitude</b></font></p>
+        <span class="required">*</span><span class="label">Latitude</span>
       </td>
       <td width="20%" valign="TOP"> 
-        <p><font size="-1">&nbsp;North/South</font></p>
+        &nbsp;North/South
       </td>
       <td width="20%" valign="TOP"> 
-        <p><font size="-1"><b><font color="#ff0000">*</font>Longitude</b></font></p>
+        <span class="required">*</span><span class="label">Longitude</span>
       </td>
       <td width="42%" valign="TOP"> 
-        <p><font size="-1">&nbsp;West/East</font></p>
+        &nbsp;West/East
       </td>
     </tr>
     <tr> 
       <td width="20%" valign="TOP"> 
-        <p><font size="-1"> 
           <input type="TEXT" name="latDeg1" value="[%latDeg1%]" size="3" maxlength="3">
           <input type="TEXT" name="latMin1" value="[%latMin1%]" size="2" maxlength="2">
           <input type="TEXT" name="latSec1" value="[%latSec1%]" size="2" maxlength="2">
-          </font></p>
       </td>
       <td width="20%" valign="TOP"> 
-        <p> <font size="-1">
           <select name="hemisphLat1">
 	    [% IF form == 're_entry' %]
 	    	<option selected>[%hemisphLat1%]</option>
@@ -1091,17 +1121,13 @@
             <option>N</option>
             <option>S</option>
           </select>
-          </font></p>
       </td>
       <td width="20%" valign="TOP"> 
-        <p><font size="-1"> 
           <input type="TEXT" name="longDeg1" value="[%longDeg1%]" size="3" maxlength="3">
           <input type="TEXT" name="longMin1" value="[%longMin1%]" size="2" maxlength="2">
           <input type="TEXT" name="longSec1" value="[%longSec1%]" size="2" maxlength="2">
-          </font></p>
       </td>
       <td width="40%" valign="TOP"> 
-        <p> <font size="-1">
           <select name="hemisphLong1">
 	    [% IF form == 're_entry' %]
 	    	<option selected>[%hemisphLong1%]</option>
@@ -1109,39 +1135,35 @@
             <option>W</option>
             <option>E</option>
           </select>
-          </font></p>
       </td>
     </tr>
     <tr> 
       <td valign="TOP" colspan="4"> 
-        <p><font size="-1"><b>The second lat./long. pair, if provided, indicates 
-          the southeast corner of a bounding box.</b></font></p>
+        The second lat./long. pair, if provided, indicates 
+        the southeast corner of a bounding box.
       </td>
     </tr>
     <tr> 
       <td width="18%" valign="TOP"> 
-        <p><font size="-1"><b>Latitude</b></font></p>
+        Latitude
       </td>
       <td width="20%" valign="TOP"> 
-        <p><font size="-1">&nbsp;North/South</font></p>
+        &nbsp;North/South
       </td>
       <td width="20%" valign="TOP"> 
-        <p><font size="-1"><b>Longitude</b></font></p>
+        Longitude
       </td>
       <td width="42%" valign="TOP"> 
-        <p><font size="-1">West/East</font></p>
+        West/East
       </td>
     </tr>
     <tr> 
       <td width="20%" valign="TOP"> 
-        <p><font size="-1"> 
           <input type="TEXT" name="latDeg2" value="[%latDeg2%]" size="3" maxlength="3">
           <input type="TEXT" name="latMin2" value="[%latMin2%]" size="2" maxlength="2">
           <input type="TEXT" name="latSec2" value="[%latSec2%]" size="2" maxlength="2">
-          </font></p>
       </td>
       <td width="20%" valign="TOP"> 
-        <p> <font size="-1">
           <select name="hemisphLat2">
 	    [% IF form == 're_entry' %]	
 	    	<option selected>[%hemisphLat2%]</option>
@@ -1149,17 +1171,13 @@
 	    <option>N</option>
             <option>S</option>
           </select>
-          </font></p>
       </td>
       <td width="20%" valign="TOP"> 
-        <p><font size="-1"> 
           <input type="TEXT" name="longDeg2" value="[%longDeg2%]" size="3" maxlength="3">
           <input type="TEXT" name="longMin2" value="[%longMin2%]" size="2" maxlength="2">
           <input type="TEXT" name="longSec2" value="[%longSec2%]" size="2" maxlength="2">
-          </font></p>
       </td>
       <td width="40%" valign="TOP"> 
-        <p> <font size="-1">
           <select name="hemisphLong2">
 	    [% IF form == 're_entry' %]
 	    	<option selected>[%hemisphLong2%]</option>
@@ -1167,13 +1185,74 @@
             <option>W</option>
             <option>E</option>
           </select>
-          </font></p>
       </td>
     </tr>
   </table>
 
   [% IF cfg == 'nceas' %]
+  <p align="left">
+  <a href="@cgi-prefix@/register-dataset.cgi?cfg=[%cfg%]&amp;stage=guide#TaxonomicCoverage" target="guide">TAXONOMIC COVERAGE OF DATA</a>
+   </p>
+  <table cellspacing="0" border="0" cellpadding="9" width="760" 
+    bgcolor="#c6d6e7">
+    <tbody>
+    <tr> 
+        <td colspan="2">
+        <p class="label">List the taxa associated with this set of data.</p>
+        <p>The Taxon Rank should indicate the level in the taxonomic
+        hierarchy (e.g., Phylum or Species) and the Taxonomic Name should 
+        be the scientific name for the organism at that level 
+        (e.g., <i>Ursus arctos</i>).</p>
+        [% numTaxa = 1 %]
+        [% IF taxaCount > 0 %]
+            [% numTaxa = taxaCount %]
+        [% END %]
+        <input type="hidden" name="taxaCount" value="[%numTaxa%]" 
+            id="taxaCount">
+        </td>
+    </tr>
+
+    <tr>
+    <td>
+        <table border="0">
+        <tbody>
+        <tr> 
+            <td><span class="label">Taxon Rank</span></td>
+            <td><span class="label">Taxon Name</span></td>
+        </tr>
+        [% cnt = 1 %]
+        [% WHILE cnt <= numTaxa %]
+            <tr> 
+            <td>
+            [% SET trn = "taxonRankName${cnt}" %]
+            <input name="taxonRankName[%cnt%]" value="[% $trn %]" size="25">
+            </td>
+            <td>
+            [% SET trv = "taxonRankValue${cnt}" %]
+            <input name="taxonRankValue[%cnt%]" value="[% $trv %]" size="25">
+            </td>
+            </tr>
+            [% cnt = cnt + 1 %]
+         [% END %]
+        <tr id="addtaxarow"> 
+            <td>
+                <input type="button" value="Add taxon" id="addtaxabutton1"
+                    onClick="addTaxon()">
+            </td>
+        </tr>
+        </tbody>
+        </table>
+
+     </td>
+     </tr>
+     </tbody>
+   </table>
+  [% END %]
+
+  [% IF cfg == 'nceas' %]
+  <p align="left">
   <a href="@cgi-prefix@/register-dataset.cgi?cfg=[%cfg%]&amp;stage=guide#Methods" target="guide">METHODS</a>
+   </p>
   <table cellspacing="0" border="0" cellpadding="9" width="760" bgcolor="#c6d6e7">
     <tbody>
     <tr> 
@@ -1207,11 +1286,9 @@
    </table>
   [% END %]
 
-  <p><b><font size="-1" color="#0000ff">
-  <a
-   href="@cgi-prefix@/register-dataset.cgi?cfg=[%cfg%]&amp;stage=guide#DataSetContactAddress"
-   target="guide">DATA SET CONTACT ADDRESS</a>
-	</font></b></p>
+  <p align="left">
+  <a href="@cgi-prefix@/register-dataset.cgi?cfg=[%cfg%]&amp;stage=guide#DataSetContactAddress" target="guide">DATA SET CONTACT ADDRESS</a>
+  </p>
   <table border="0" cellspacing="0" cellpadding="9" width="760" bgcolor="#c6d6e7">
     <tr> 
       <td valign="TOP" colspan="3"><font size="-1" color="#ff0000"> 
@@ -1330,12 +1407,10 @@
       </td>
     </tr>
   </table>
-  <br>
-  <p align="left"><font size="4" color="0000ff"><b><font size="-1">
-  <a
-   href="@cgi-prefix@/register-dataset.cgi?cfg=[%cfg%]&amp;stage=guide#DistributionIinformation"
-   target="guide">DISTRIBUTION INFORMATION</a>
-	</font></b></font> 
+
+  <p align="left">
+  <a href="@cgi-prefix@/register-dataset.cgi?cfg=[%cfg%]&amp;stage=guide#DistributionIinformation" target="guide">DISTRIBUTION INFORMATION</a>
+  </p>
   <table cellspacing="0" border="0" cellpadding="9" width="760"
 bgcolor="#c6d6e7">
     <tr> 
@@ -1368,10 +1443,6 @@
           </font></p>
       </td>
     </tr>
-<!--
-  <table cellspacing="0" border="0" cellpadding="9" width="760"
-bgcolor="#c6d6e7">
--->
     <tr> 
       <td width="50%" valign="TOP"> 
         <p> <font size="-1"><b><font color="#ff0000">*</font>Use Constraints:</b></font> 
@@ -1395,9 +1466,6 @@
           </font></p>
       </td>
     </tr>
-<!--
-  </table>
--->
     <tr> 
       <td> 
         <p align="left"><font size="-1"> 
@@ -1415,7 +1483,7 @@
       </td>
     </tr>
   </table>
-  <br>
+
   <div align="center"> 
     <table width="760" border="0" cellpadding="9" align="left" bgcolor="#C6d6e7" cellspacing="0">
       <tr> 
Index: lib/style/common/templates/confirmData.tmpl
===================================================================
--- lib/style/common/templates/confirmData.tmpl	(revision 1983)
+++ lib/style/common/templates/confirmData.tmpl	(revision 1984)
@@ -484,11 +484,24 @@
     </tr>
   </table>
 
+    [% numTaxa = 0 %]
+    [% IF taxaCount > 0 %]
+        [% numTaxa = taxaCount %]
+    [% END %]
+    <hr>
+    <a name="Taxonomic Coverage"></a>
+    [% cnt = 1 %]
+    [% WHILE cnt <= numTaxa %]
+        [% SET trn = "taxonRankName${cnt}" %]
+        [% SET trv = "taxonRankValue${cnt}" %]
+        <p><b><font size="-1">Taxon:</font></b>  [% $trn %]: [% $trv %]</p>
+        [% cnt = cnt + 1 %]
+     [% END %]
 
 [% IF cfg == 'nceas' %]
     <hr>
     <a name="Methods"></a>
-    <p><b><font size="-1">Mthod Title:</font></b>  [%methodTitle%]</p>
+    <p><b><font size="-1">Method Title:</font></b>  [%methodTitle%]</p>
     [% FOREACH para = methodPara %]
         <p><b><font size="-1">Paragraph:</font></b>  [%para%] </p>
     [% END %]
@@ -696,6 +709,16 @@
   <input type="hidden" name="longMin2" value="[%longMin2%]">
   <input type="hidden" name="longSec2" value="[%longSec2%]">
   <input type="hidden" name="hemisphLong2" value="[%hemisphLong2%]">
+  <input type="hidden" name="taxaCount" value="[%taxaCount%]">
+  [% cnt = 1 %]
+  [% WHILE cnt <= numTaxa %]
+      [% SET trn = "taxonRankName${cnt}" %]
+      [% SET trv = "taxonRankValue${cnt}" %]
+      <input type="hidden" name="[% trn %]" value="[% $trn %]">
+      <input type="hidden" name="[% trv %]" value="[% $trv %]">
+      [% cnt = cnt + 1 %]
+  [% END %]
+
   [% IF cfg == 'nceas' %]
       <input type="hidden" name="methodTitle" value="[%methodTitle%]">
       [% FOREACH para = methodPara %]
Index: src/perl/register-dataset.cgi
===================================================================
--- src/perl/register-dataset.cgi	(revision 1983)
+++ src/perl/register-dataset.cgi	(revision 1984)
@@ -1127,37 +1127,30 @@
     $doc .= "</boundingCoordinates>\n";
     $doc .= "</geographicCoverage>\n";
 
-    # Taxonomic coverage information
-    # my $foundFirstTaxKeyword = 0;
-    # foreach my $tmp (param()) {
-    #    if ($tmp =~ /keyword/) {
-    #        my $tmp1 = $tmp;
-    #        $tmp1 =~ s/keyword//; # get the index of the parameter 0, ..., 10
-    #        if ( $tmp1 =~ /[0-9]/ ){
-    #            # don't generate xml for empty keyword fields
-    #            if (hasContent(param($tmp))) {
-    #                if (hasContent(param("kwType" . $tmp1)) &&
-    #                   (param("kwType" . $tmp1) eq "taxonomic") ) {
-    #                    # Opening tags before first taxonomic. keyword.
-    #                    if ($foundFirstTaxKeyword == 0) {
-    #                        $foundFirstTaxKeyword = 1;
-    #                        $doc .= "<taxonomicCoverage>\n";
-    #                    }
-    #                    $doc .= "<keywtax>\n";
-    #                    $doc .= "<taxonkt>".param("kwTh".$tmp1)."</taxonkt>\n";
-    #                    $doc .= "<taxonkey>".param("keyword".$tmp1).
-    #                            "</taxonkey>\n";
-    #                    $doc .= "</keywtax>\n";
-    #                }
-    #            }
-    #        }
-    #    }
-    # }
-    # Closing tag for taxonomic coverage, if there was a tax. keyword
-    # if ($foundFirstTaxKeyword == 1) {
-    #    $doc .= "<taxoncl></taxoncl>\n";
-    #    $doc .= "</taxonomicCoverage>\n";
-    # }
+    # Write out the taxonomic coverage fields
+    my $foundFirstTaxon = 0;
+    foreach my $trn (param()) {
+        if ($trn =~ /taxonRankName/) {
+            my $taxIndex = $trn;
+            $taxIndex =~ s/taxonRankName//; # get the index of the parameter 0, ..., 10
+            my $trv = "taxonRankValue".$taxIndex;
+            if ( $taxIndex =~ /[0-9]/ ){
+                if (hasContent(param($trn)) && hasContent(param($trv))) {
+                    if (! $foundFirstTaxon) {
+                        $doc .= "<taxonomicCoverage>\n";
+                        $foundFirstTaxon = 1;
+                    }
+                    $doc .= "<taxonomicClassification>\n";
+                    $doc .= "  <taxonRankName>".param($trn)."</taxonRankName>\n";
+                    $doc .= "  <taxonRankValue>".param($trv)."</taxonRankValue>\n";
+                    $doc .= "</taxonomicClassification>\n";
+                }
+            }
+        }
+    }
+    if ($foundFirstTaxon) {
+        $doc .= "</taxonomicCoverage>\n";
+    }
 
     $doc .= "</coverage>\n";
 
@@ -1714,7 +1707,7 @@
         errMoreThanOne("coverage");
     } else {
         foreach $node ($results->get_nodelist) {
-            dontOccur($node, "./temporalCoverage/rangeOfDates/beginDate/time|./temporalCoverage/rangeOfDates/beginDate/alternativeTimeScale|./temporalCoverage/rangeOfDates/endDate/time|./temporalCoverage/rangeOfDates/endDate/alternativeTimeScale|./taxonomicCoverage|./geographicCoverage/datasetGPolygon|./geographicCoverage/boundingCoordinates/boundingAltitudes", "temporalCoverage/rangeOfDates/beginDate/time, /temporalCoverage/rangeOfDates/beginDate/alternativeTimeScale, /temporalCoverage/rangeOfDates/endDate/time, /temporalCoverage/rangeOfDates/endDate/alternativeTimeScale, /taxonomicCoverage, /geographicCoverage/datasetGPolygon, /geographicCoverage/boundingCoordinates/boundingAltitudes");
+            dontOccur($node, "./temporalCoverage/rangeOfDates/beginDate/time|./temporalCoverage/rangeOfDates/beginDate/alternativeTimeScale|./temporalCoverage/rangeOfDates/endDate/time|./temporalCoverage/rangeOfDates/endDate/alternativeTimeScale|./taxonomicCoverage/taxonomicSystem|./taxonomicCoverage/generalTaxonomicCoverage|./taxonomicCoverage/taxonomicClassification/commonName|./taxonomicCoverage/taxonomicClassification/taxonomicClassification|./geographicCoverage/datasetGPolygon|./geographicCoverage/boundingCoordinates/boundingAltitudes", "temporalCoverage/rangeOfDates/beginDate/time, /temporalCoverage/rangeOfDates/beginDate/alternativeTimeScale, /temporalCoverage/rangeOfDates/endDate/time, /temporalCoverage/rangeOfDates/endDate/alternativeTimeScale, /taxonomicCoverage/taxonomicSystem, /taxonomicCoverage/generalTaxonomicCoverage, /taxonomicCoverage/taxonomicClassification/commonName, /taxonomicCoverage/taxonomicClassification/taxonomicClassification, /geographicCoverage/datasetGPolygon, /geographicCoverage/boundingCoordinates/boundingAltitudes");
 
             $tempResult = $node->findnodes('./temporalCoverage');
             if ($tempResult->size > 1) {
@@ -1816,6 +1809,17 @@
                     eval($$templateVars{'longSec2'} = int($coord));
                 }
             }
+
+            $tempResult = $node->findnodes('./taxonomicCoverage/taxonomicClassification');
+            my $taxonIndex = 0;
+            foreach $tempNode ($tempResult->get_nodelist) {
+                $taxonIndex++;
+                my $taxonRankName = findValue($tempNode, "taxonRankName");
+                my $taxonRankValue = findValue($tempNode, "taxonRankValue");
+                $$templateVars{"taxonRankName".$taxonIndex} = $taxonRankName;
+                $$templateVars{"taxonRankValue".$taxonIndex} = $taxonRankValue;
+            }
+            $$templateVars{'taxaCount'} = $taxonIndex;
         }
     }
     dontOccur($doc, "./purpose", "purpose");
@@ -2274,6 +2278,23 @@
     $$templateVars{'longMin2'} = $FORM::longMin2;
     $$templateVars{'longSec2'} = $FORM::longSec2;
     $$templateVars{'hemisphLong2'} = $FORM::hemisphLong2;
+
+    $$templateVars{'taxaCount'} = $FORM::taxaCount;
+    foreach my $trn (param()) {
+        if ($trn =~ /taxonRankName/) {
+            my $taxIndex = $trn;
+            $taxIndex =~ s/taxonRankName//; # get the index of the parameter 0, ..., 10
+            my $trv = "taxonRankValue".$taxIndex;
+            if ( $taxIndex =~ /[0-9]/ ){
+                if (hasContent(param($trn)) && hasContent(param($trv))) {
+                    debug("Registry processing taxon: $trn = ".param($trn)." $trv = ".param($trv));
+                    $$templateVars{$trn} = param($trn);
+                    $$templateVars{$trv} = param($trv);
+                }
+            }
+        }
+    }
+
     $$templateVars{'methodTitle'} = $FORM::methodTitle;
     $$templateVars{'methodPara'} = \@FORM::methodPara;
     $$templateVars{'docid'} = $FORM::docid;
