Index: /trunk/DNSDB.pm
===================================================================
--- /trunk/DNSDB.pm	(revision 224)
+++ /trunk/DNSDB.pm	(revision 225)
@@ -34,5 +34,6 @@
 	&getSOA	&getRecLine &getDomRecs &getRecCount
 	&addRec &updateRec &delRec
-        &getParents
+	&getTypelist
+	&getParents
 	&isParent
 	&domStatus &importAXFR
@@ -54,5 +55,6 @@
 		&getSOA &getRecLine &getDomRecs &getRecCount
 		&addRec &updateRec &delRec
-	        &getParents
+		&getTypelist
+		&getParents
 		&isParent
 		&domStatus &importAXFR
@@ -132,5 +134,5 @@
 
 ##
-## utilty functions
+## utility functions
 # _rectable()
 # Takes default+rdns flags, returns appropriate table name
@@ -1607,4 +1609,51 @@
 		record	=> 'domain'
 	);
+
+
+## DNSDB::getTypelist()
+# Get a list of record types for various UI dropdowns
+# Takes database handle, forward/reverse/lookup flag, and optional "tag as selected" indicator (defaults to A)
+# Returns an arrayref to list of hashrefs perfect for HTML::Template
+sub getTypelist {
+  my $dbh = shift;
+  my $recgroup = shift;
+  my $type = shift || $reverse_typemap{A};
+
+  # also accepting $webvar{revrec}!
+  $recgroup = 'f' if $recgroup eq 'n';
+  $recgroup = 'r' if $recgroup eq 'y';
+
+  my $sql = "SELECT val,name FROM rectypes WHERE ";
+  if ($recgroup eq 'r') {
+    # reverse zone types
+    $sql .= "stdflag=2 OR stdflag=3";
+  } elsif ($recgroup eq 'l') {
+    # DNS lookup types.  Note we avoid our custom types >= 65280, since those are entirely internal.
+    $sql .= "(stdflag=1 OR stdflag=2 OR stdflag=3) AND val < 65280";
+  } else {
+    # default;  forward zone types.  technically $type eq 'f' but not worth the error message.
+    $sql .= "stdflag=1 OR stdflag=2";
+  }
+  $sql .= " ORDER BY listorder";
+
+  my $sth = $dbh->prepare($sql);
+  $sth->execute;
+  my @typelist;
+  while (my ($rval,$rname) = $sth->fetchrow_array()) {
+    my %row = ( recval => $rval, recname => $rname );
+    $row{tselect} = 1 if $rval == $type;
+    push @typelist, \%row;
+  }
+
+  # Add SOA on lookups since it's not listed in other dropdowns.
+  if ($recgroup eq 'l') {
+    my %row = ( recval => $reverse_typemap{SOA}, recname => 'SOA' );
+    $row{tselect} = 1 if $reverse_typemap{SOA} == $type;
+    push @typelist, \%row;
+  }
+
+  return \@typelist;
+} # end getTypelist()
+
 
 ## DNSDB::getParents()
Index: /trunk/dns.cgi
===================================================================
--- /trunk/dns.cgi	(revision 224)
+++ /trunk/dns.cgi	(revision 225)
@@ -601,5 +601,5 @@
     $page->param(port		=> $recdata->{port});
     $page->param(ttl		=> $recdata->{ttl});
-    fill_rectypes($recdata->{type});
+    $page->param(typelist	=> getTypelist($dbh, $webvar{revrec}, $webvar{type}));
 
   } elsif ($webvar{recact} eq 'update') {
@@ -1384,5 +1384,5 @@
 
   $page->param(qfor => $webvar{qfor}) if $webvar{qfor};
-  fill_rectypes($webvar{type} ? $webvar{type} : '', 1);
+  $page->param(typelist => getTypelist($dbh, 'l', ($webvar{type} ? $webvar{type} : undef)));
   $page->param(nrecurse => $webvar{nrecurse}) if $webvar{nrecurse};
   $page->param(resolver => $webvar{resolver}) if $webvar{resolver};
@@ -1778,27 +1778,6 @@
 }
 
-# fill in record type list on add/update/edit record template
-sub fill_rectypes {
-  my $type = shift || $reverse_typemap{A};
-  my $soaflag = shift || 0;
-
-  my $sth = $dbh->prepare("SELECT val,name FROM rectypes WHERE stdflag=1 ORDER BY listorder");
-  $sth->execute;
-  my @typelist;
-  while (my ($rval,$rname) = $sth->fetchrow_array()) {
-    my %row = ( recval => $rval, recname => $rname );
-    $row{tselect} = 1 if $rval == $type;
-    push @typelist, \%row;
-  }
-  if ($soaflag) {
-    my %row = ( recval => $reverse_typemap{SOA}, recname => 'SOA' );
-    $row{tselect} = 1 if $reverse_typemap{SOA} == $type;
-    push @typelist, \%row;
-  }
-  $page->param(typelist	=> \@typelist);
-} # fill_rectypes
-
 sub fill_recdata {
-  fill_rectypes($webvar{type});
+  $page->param(typelist => getTypelist($dbh, $webvar{revrec}, $webvar{type}));
 
 # le sigh.  we may get called with many empty %webvar keys
