Index: trunk/dns.cgi
===================================================================
--- trunk/dns.cgi	(revision 637)
+++ trunk/dns.cgi	(revision 638)
@@ -1077,15 +1077,18 @@
   fill_permissions($page, \%grpperms);
 
-} elsif ($webvar{page} eq 'bulkdomain') {
+} elsif ($webvar{page} eq 'bulkdomain' || $webvar{page} eq 'bulkrev') {
   # Bulk operations on domains.  Note all but group move are available on the domain list.
 ##fixme:  do we care about bulk operations on revzones?  Move-to-group, activate, deactivate,
 # and delete should all be much rarer for revzones than for domains.
 
-  changepage(page => "domlist", errmsg => "You are not permitted to make bulk domain changes")
+  changepage(page => "domlist", errmsg => "You are not permitted to make bulk zone changes")
 	unless ($permissions{admin} || $permissions{domain_edit} || $permissions{domain_create} || $permissions{domain_delete});
 
   fill_grouplist("grouplist");
 
-  my $count = $dnsdb->getZoneCount(revrec => 'n', curgroup => $curgroup);
+  $page->param(fwdzone => $webvar{page} eq 'bulkdomain');
+
+  my $count = $dnsdb->getZoneCount(revrec => ($webvar{page} eq 'bulkdomain' ? 'n' : 'y'),
+	curgroup => $curgroup);
 
   $page->param(curpage => $webvar{page});
@@ -1094,10 +1097,11 @@
   $page->param(perpage => $perpage);
 
-  my $domlist = $dnsdb->getZoneList(revrec => 'n', curgroup => $curgroup, offset => $offset);
+  my $domlist = $dnsdb->getZoneList(revrec => ($webvar{page} eq 'bulkdomain' ? 'n' : 'y'),
+	curgroup => $curgroup, offset => $offset);
   my $rownum = 0;
   foreach my $dom (@{$domlist}) {
     delete $dom->{status};
     delete $dom->{group};
-    $dom->{newrow} = (++$rownum) % 5 == 0;
+    $dom->{newrow} = (++$rownum) % 5 == 0 && $rownum != $perpage;
   }
 
@@ -1140,26 +1144,28 @@
   # order here, and since we don't have the domain names until we go around this
   # loop, we can't alpha-sort them here.  :(
-  foreach (keys %webvar) {
+  foreach my $input (keys %webvar) {
     my %row;
-    next unless $_ =~ /^dom_\d+$/;
+    next unless $input =~ /^(dom|rev)_\d+$/;
+    my $fr = $1;
     # second security check - does the user have permission to meddle with this domain?
-    if (!check_scope(id => $webvar{$_}, type => 'domain')) {
-      $row{domerr} = "You are not permitted to make changes to the requested domain";
-      $row{domain} = $webvar{$_};
+    if (!check_scope(id => $webvar{$input}, type => ($fr eq 'dom' ? 'domain' : 'revzone'))) {
+      $row{domerr} = "You are not permitted to make changes to the requested zone";
+      $row{domain} = $webvar{$input};
       push @bulkresults, \%row;
       next;
     }
-    $row{domain} = $dnsdb->domainName($webvar{$_});
+    $row{domain} = ($fr eq 'dom' ? $dnsdb->domainName($webvar{$input}) : $dnsdb->revName($webvar{$input}));
 
     # Do the $webvar{bulkaction}
     my ($code, $msg);
-    ($code, $msg) = $dnsdb->changeGroup('domain', $webvar{$_}, $webvar{destgroup})
+    ($code, $msg) = $dnsdb->changeGroup(($fr eq 'dom' ? 'domain' : 'revzone'), $webvar{$input}, $webvar{destgroup})
 	if $webvar{bulkaction} eq 'move';
     if ($webvar{bulkaction} eq 'deactivate' || $webvar{bulkaction} eq 'activate') {
-      my $stat = $dnsdb->zoneStatus($webvar{$_}, 'n', ($webvar{bulkaction} eq 'activate' ? 'domon' : 'domoff'));
+      my $stat = $dnsdb->zoneStatus($webvar{$input}, ($fr eq 'dom' ? 'n' : 'y'),
+	($webvar{bulkaction} eq 'activate' ? 'domon' : 'domoff'));
       $code = (defined($stat) ? 'OK' : 'FAIL');
       $msg = (defined($stat) ? $DNSDB::resultstr : $DNSDB::errstr);
     }
-    ($code, $msg) = $dnsdb->delZone($webvar{$_}, 'n')
+    ($code, $msg) = $dnsdb->delZone($webvar{$input}, ($fr eq 'dom' ? 'n' : 'y'))
 	if $webvar{bulkaction} eq 'delete';
 
Index: trunk/templates/bulkdomain.tmpl
===================================================================
--- trunk/templates/bulkdomain.tmpl	(revision 637)
+++ trunk/templates/bulkdomain.tmpl	(revision 638)
@@ -17,5 +17,5 @@
 <tr><td>
     <table border="0" cellspacing="2" cellpadding="2" width="100%">
-	<tr class="darkrowheader"><td colspan="2" align="center">Bulk Domain Changes</td></tr>
+	<tr class="darkrowheader"><td colspan="2" align="center">Bulk Zone Changes</td></tr>
 
 	<tr class="datalinelight">
@@ -32,5 +32,5 @@
 	</tr>
 	<tr class="darkrowheader">
-		<td colspan="2" align="center">Domains to change:</td>
+		<td colspan="2" align="center">Zones to change:</td>
 	</tr>
 	<tr class="datalinelight">
@@ -38,9 +38,10 @@
 <div class="center"><TMPL_INCLUDE NAME="pgcount.tmpl"></div>
 <div class="center"><TMPL_INCLUDE NAME="fpnla.tmpl"></div>
-<div class="center hidden" id="selall"><input type="checkbox" name="selall" id="master" onclick="bulk_selall();" /> Select all domains on this page</div>
+<div class="center hidden" id="selall"><input type="checkbox" name="selall" id="master" onclick="bulk_selall();" 
+/> Select all zones on this page</div>
 
 <table>
 <tr>
-<TMPL_LOOP NAME=domtable><td><input type="checkbox" name="dom_<TMPL_VAR NAME=zoneid>" value="<TMPL_VAR NAME=zoneid>" /> <TMPL_VAR NAME=zone></td>
+<TMPL_LOOP NAME=domtable><td><input type="checkbox" name="<TMPL_IF fwdzone>dom<TMPL_ELSE>rev</TMPL_IF>_<TMPL_VAR NAME=zoneid>" value="<TMPL_VAR NAME=zoneid>" /> <TMPL_VAR NAME=zone></td>
 <TMPL_IF newrow></tr>
 <tr>
Index: trunk/templates/bulkrev.tmpl
===================================================================
--- trunk/templates/bulkrev.tmpl	(revision 638)
+++ trunk/templates/bulkrev.tmpl	(revision 638)
@@ -0,0 +1,1 @@
+<TMPL_INCLUDE bulkdomain.tmpl>
Index: trunk/templates/menu.tmpl
===================================================================
--- trunk/templates/menu.tmpl	(revision 637)
+++ trunk/templates/menu.tmpl	(revision 638)
@@ -12,4 +12,5 @@
 <TMPL_IF mayimport><a href="<TMPL_VAR NAME=script_self>&amp;page=axfr">AXFR Import</a><br /></TMPL_IF>
 <TMPL_IF maybulk><a href="<TMPL_VAR NAME=script_self>&amp;page=bulkdomain">Bulk Domain Operations</a><br /></TMPL_IF>
+<TMPL_IF maybulk><a href="<TMPL_VAR NAME=script_self>&amp;page=bulkrev">Bulk Reverse Zone Operations</a><br /></TMPL_IF>
 <br />
 <a href="<TMPL_VAR NAME=script_self>&amp;page=grpman"><TMPL_IF chggrps>Manage<TMPL_ELSE>View</TMPL_IF> groups</a><br />
Index: trunk/templates/widgets.js
===================================================================
--- trunk/templates/widgets.js	(revision 637)
+++ trunk/templates/widgets.js	(revision 638)
@@ -14,9 +14,9 @@
   var newstate = document.getElementById("master").checked;
   for (var i=0; i<y.length; i++) {
-    // only monkey with the dom_nnnn checkboxes
-    if (y[i].name.substring(0,4) == 'dom_') {
+    // only monkey with the dom/rev_nnnn checkboxes
+    if (y[i].name.substring(0,4) == 'dom_' || y[i].name.substring(0,4) == 'rev_') {
       if (newstate == true) {
         // if the master gets checkmarked, save the original state of
-        // the dom_nnn checkbox, and force it to "true"
+        // the dom/rev_nnn checkbox, and force it to "true"
         bulk_selstate[i] = y[i].checked;
         y[i].checked = true;
