#!/usr/bin/perl -wd
#
# $Id: zone.cgi 555 2007-02-25 16:39:52Z matt $
#
# NicTool v2.00-rc1 Copyright 2001 Damon Edwards, Abe Shelton & Greg Schueler
# NicTool v2.01+ Copyright 2004-2007 The Network People, Inc.
#
# NicTool is free software; you can redistribute it and/or modify it under
# the terms of the Affero General Public License as published by Affero,
# Inc.; either version 1 of the License, or any later version.
#
# NicTool is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the Affero GPL for details.
#
# You should have received a copy of the Affero General Public License
# along with this program; if not, write to Affero Inc., 521 Third St,
# Suite 225, San Francisco, CA 94107, USA
#

#use strict;
require 'nictoolclient.conf';
#jfdesir
use DBI;
use File::Copy;
$date=`date +%Y%m%d%s`;
chomp $date;
$q = new CGI;
$zoneid = $q->param('nt_zone_id');
$user = "nictool";
$pass = "nictool";
$host = "sqlhost";
$port = "3306";
$db = "nictool";
$work_dir = '/appli/named';

#my($domain, $ns0id , $ns1idi, $ns2id, $ttl ,$ns0, $mail, $serial, $refresh, $retry, $expire, $mini, $ns0, $ns1, $ns2, $ns1id,$n2id);
$dbh = DBI->connect ("DBI:mysql:database=$db;host=$host:$port;user=$user;password=$pass") || die "Connect failed: $DBI::errstr\n";
#fin jfdesir


&main();

sub main {
    my $q      = new CGI();
    my $nt_obj = new NicToolClient($q);

    return if ( $nt_obj->check_setup ne 'OK' );

    my $user = $nt_obj->verify_session();

    if ($user) {
        print $q->header;
        &display( $nt_obj, $q, $user );
    }
}

sub display {
    my ( $nt_obj, $q, $user ) = @_;

    if ( defined $q->param('nt_zone_record_id') ) {
# I'm not crazy about running off and doing DB queries this early, especially 
# since we'll be doing them again later, but in order to display the dynamic 
# form with the proper fields, we really must use onLoad which is only
# avalaible in the body tag. --mps (2/24/2007)
        my $zone_record = $nt_obj->get_zone_record( nt_zone_record_id => $q->param('nt_zone_record_id') );
#       warn Data::Dumper::Dumper $zone_record;
        my $rr_type     = $zone_record->{'type'};
        $nt_obj->parse_template($NicToolClient::start_html_template, ONLOAD_JS=>"show_rr_edit_rows(\'$rr_type\')");
    } else {
        $nt_obj->parse_template($NicToolClient::start_html_template);
    }
    $nt_obj->parse_template(
        $NicToolClient::body_frame_start_template,
        username  => $user->{'username'},
        groupname => $user->{'groupname'},
        userid    => $user->{'nt_user_id'},
    );

    my $zone = $nt_obj->get_zone( nt_zone_id => $q->param('nt_zone_id') );

    my $level = $nt_obj->display_group_tree(
        $user,
        $user->{'nt_group_id'},
        $zone->{'delegated_by_id'} ? '' : $q->param('nt_group_id'), 0
    );

    if ( $zone->{'error_code'} ne 200 ) {
        $nt_obj->display_nice_error( $zone, "Get Zone" );
        return;
    }

    my $zone_summary = $nt_obj->get_zone_summary(
        nt_group_id => $q->param('nt_group_id'),
        nt_zone_id  => $q->param('nt_zone_id')
    );

    $nt_obj->display_zone_list_options( $user, $q->param('nt_group_id'),
        $level, 0 );
    $nt_obj->display_zone_options( $user, $zone, $level + 1, 0 );    #1);

    $zone = &display_properties( $nt_obj, $user, $q, $zone, $zone_summary );
    &display_nameservers( $nt_obj, $user, $q, $zone, $zone_summary );
    &display_summary( $nt_obj, $q, $zone, $zone_summary );
    &display_zone_records( $nt_obj, $user, $q, $zone, $zone_summary );

    $nt_obj->parse_template($NicToolClient::end_html_template);
}

sub display_properties {
    my ( $nt_obj, $user, $q, $zone ) = @_;
    my $isdelegate = exists $zone->{'delegated_by_id'};
    if ( $q->param('edit_zone') ) {
        if ( $q->param('Save') ) {
            my @fields
                = qw(nt_zone_id nt_group_id zone nameservers description mailaddr serial refresh retry expire ttl minimum);
            my %data;
            foreach (@fields) { $data{$_} = $q->param($_); }
            $data{'nameservers'} = join( ',', $q->param('nameservers') );
            $data{'deleted'} = '0' if $q->param('undelete');

            #warn "nameservers: ".$data{'nameservers'};
            #warn "data: ".join(":",map {$_."=".$data{$_}} keys %data);
            my $error = $nt_obj->edit_zone(%data);
            if ( $error->{'error_code'} != 200 ) {
                &display_edit_zone( $nt_obj, $user, $q, $error, $zone,
                    'edit' );
            }
            else {
                $zone = $nt_obj->get_zone(
                    nt_group_id => $q->param('nt_group_id'),
                    nt_zone_id  => $q->param('nt_zone_id')
                );
            }
        }
        elsif ( $q->param('Cancel') ) {

        }
        else {
            &display_edit_zone( $nt_obj, $user, $q, '', $zone, 'edit' );
        }
    }
    if ( $q->param('new_zone') ) {
        if ( $q->param('Create') ) {
            my @fields
                = qw(nt_group_id zone nameservers description mailaddr serial refresh retry expire ttl minimum);
            my %data;
            foreach (@fields) { $data{$_} = $q->param($_); }
            $data{'nameservers'} = join( ',', $q->param('nameservers') );

            #warn "nameservers: ".$data{'nameservers'};
            #warn "data: ".join(":",map {$_."=".$data{$_}} keys %data);
            my $error = $nt_obj->new_zone(%data);
            if ( $error->{'error_code'} != 200 ) {
                &display_edit_zone( $nt_obj, $user, $q, $error, $zone,
                    'new' );
            }
            else {
                if ($NicToolClient::edit_after_new_zone) {
                    $q->param( -name => 'object', -value => 'zone' );
                    $q->param(
                        -name  => 'obj_id',
                        -value => $error->{'nt_zone_id'}
                    );
                    return $nt_obj->redirect_from_log($q);
                }
                $zone = $nt_obj->get_zone(
                    nt_group_id => $q->param('nt_group_id'),
                    nt_zone_id  => $error->{'nt_zone_id'}
                );
                if ( $zone->{'error_code'} != 200 ) {
                    $nt_obj->display_nice_error( $zone, "Get Zone" );
                }

            }
        }
        elsif ( $q->param('Cancel') ) {

        }
        else {
            &display_edit_zone( $nt_obj, $user, $q, '', $zone, 'new' );
        }
    }

    if (   $q->param('deletedelegate')
        && $q->param('type') ne 'record'
        && $q->param('nt_zone_id')
        && $q->param('delegate_group_id') )
    {
        my $error = $nt_obj->delete_zone_delegation(
            nt_zone_id  => $q->param('nt_zone_id'),
            nt_group_id => $q->param('delegate_group_id')
        );
        if ( $error->{'error_code'} != 200 ) {
            $nt_obj->display_nice_error( $error, "Delete Zone Delegation" );
        }
        else {
            $nt_obj->display_nice_message(
                "The zone delegation was successfully removed.",
                "Delegation Removed" );
        }
    }
    elsif ($q->param('deletedelegate')
        && $q->param('type') eq 'record'
        && $q->param('nt_zone_record_id')
        && $q->param('delegate_group_id') )
    {
        my $error = $nt_obj->delete_zone_record_delegation(
            nt_zone_record_id => $q->param('nt_zone_record_id'),
            nt_group_id       => $q->param('delegate_group_id')
        );
        if ( $error->{'error_code'} != 200 ) {
            $nt_obj->display_nice_error( $error,
                "Delete Zone Record Delegation" );
        }
        else {
            $nt_obj->display_nice_message(
                "The resource record delegation was successfully removed.",
                "Delegation Removed" );
        }
    }
    my @state_fields;
    foreach ( @{ $nt_obj->paging_fields } ) {
        push( @state_fields, "$_=" . $q->escape( $q->param($_) ) )
            if ( $q->param($_) );
    }

    if ( $zone->{'deleted'} ) {
        print qq( 
        <table cellpadding=2 cellspacing=2 border=0 width=100%>
        <tr bgcolor=$NicToolClient::dark_grey>
            <td>
                <table cellpadding=2 cellspacing=2 border=0 width=100%>
                <tr bgcolor=$NicToolClient::light_hilite>
                    <td nowrap colspan=2> This zone may not be modified because it is deleted.
                    </td></tr>
                </table>
            </td>
        </tr>
        </table>
                );

    }

    #show delegation information if has been delegated to you
    if ($isdelegate) {
        print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
        print
            "<tr bgcolor=$NicToolClient::dark_grey><td><table cellpadding=0 cellspacing=0 border=0 width=100%>";
        print "<tr>";
        print "<td><b>Delegation</b></td>";
        print "</tr></table>";
        print "</td></tr></table>";

        print "<table cellpadding=2 cellspacing=0 border=0 width=100%>";
        print "<tr>";
        print "<td valign=top>";
        print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";

        if ( !$zone->{'pseudo'} ) {
            print qq(
                <tr bgcolor=$NicToolClient::light_grey>
                    <td nowrap> Delegated by: </td>
                    <td width=100%>
                        <table>
                        <tr><td valign=center><img border=0 src=$NicToolClient::image_dir/user.gif></td>
                            <td valign=center> $zone->{'delegated_by_name'}</td>
                        </tr>
                        </table>
                    </td>
                </tr>);
        }
        else {
            print qq(
                <tr bgcolor=$NicToolClient::light_hilite>
                    <td nowrap colspan=2> This zone is visible because some of its records have been delegated to you.</td>
                </tr>);

        }

        print qq(
            <tr bgcolor=$NicToolClient::light_grey>
                <td nowrap> Belonging to group: </td>
                <td width=100%>
                    <table>
                        <tr>
                            <td valign=center><img border=0 src=$NicToolClient::image_dir/group.gif></td>
                            <td valign=center> $zone->{'group_name'}</td>
                        </tr>
                    </table>
                </td>
            </tr>);

        #print "</td><td width=50% valign=top>";
        if ( !$zone->{'pseudo'} ) {
            print qq(
            <tr bgcolor=$NicToolClient::light_grey>
                <td nowrap> With Permissions: </td>
                <td width=100%>
                    <table cellpadding=2 cellspacing=2 border=0>
                        <tr bgcolor=$NicToolClient::light_grey>);
            my %perms = (
                'write'          => "Write",
                'delete'         => "Remove Delegation",
                'delegate'       => "Re-delegate",
                'add_records'    => "Add Records",
                'delete_records' => "Delete Records"
            );
            foreach (qw(write delete delegate add_records delete_records)) {
                print "<td>";

#print "<img src=$NicToolClient::image_dir/perm-".($zone->{"delegate_$_"}?"$_.gif":"no$_.gif").">&nbsp;".$perms{$_};
                print "<img src=$NicToolClient::image_dir/perm-"
                    . (
                    $zone->{"delegate_$_"} ? "checked.gif" : "unchecked.gif" )
                    . ">&nbsp;"
                    . $perms{$_};
                print "</td>";
            }
            print "</tr></table>";
            print "</td></tr>";
        }
        print "</table>";
        print "</td></tr></table>";

    }
    else {
        my $delegates = $nt_obj->get_zone_delegates(
            nt_zone_id => $zone->{nt_zone_id} );
        if ( $delegates->{error_code} ne 200 ) {
            warn "error get_zone_delegates: "
                . $delegates->{'error_code'} . " "
                . $delegates->{'error_msg'};
        }
        elsif ( @{ $delegates->{'delegates'} } gt 0 ) {
            print qq{
            <table cellpadding=2 cellspacing=2 border=0 width=100%>
            <tr bgcolor=$NicToolClient::dark_grey>
                <td>
                    <table cellpadding=0 cellspacing=0 border=0 width=100%>
                        <tr>
                        <td><b>Zone Delegates</b></td>
                        </tr>
                    </table>
                </td>
            </tr>
            </table>

            <table cellpadding=2 cellspacing=0 border=0 width=100%>
            <tr>
                <td valign=top>
                    <table cellpadding=2 cellspacing=2 border=0 width=100%>

                    <tr bgcolor=$NicToolClient::light_grey>
                        <td nowrap> Delegated To Group</td>
                        <td nowrap> Delegated By</td>
                        <td nowrap> Access Permissions}
                . $nt_obj->help_link('delperms') . qq{</td>
                        <td nowrap width=1%> Edit</td>
                        <td nowrap width=1% align=center><img src=$NicToolClient::image_dir/trash-delegate.gif></td>
                    </tr>
            };
            foreach my $del ( @{ $delegates->{'delegates'} } ) {
                print qq(
                    <tr bgcolor=$NicToolClient::light_grey>
                        <td nowrap valign=center>
                            <table><tr>
                            <td valign=center><a href=group.cgi?nt_group_id=$del->{'nt_group_id'}><img src=$NicToolClient::image_dir/group.gif border=0></a></td>
                            <td valign=center><a href=group.cgi?nt_group_id=$del->{'nt_group_id'}>$del->{'group_name'}</a></td>
                            </tr>
                            </table>
                        </td>
                        <td nowrap valign=center>
                            <table><tr>
                            <td valign=center><a href=user.cgi?nt_user_id=$del->{'delegated_by_id'}><img src=$NicToolClient::image_dir/user.gif border=0></a></td>
                            <td valign=center><a href=user.cgi?nt_user_id=$del->{'delegated_by_id'}>$del->{'delegated_by_name'}</a></td>
                            </tr>
                            </table>
                        </td>
                        <td nowrap>
                            <table><tr>)

#<td><img src=$NicToolClient::image_dir/perm-).($del->{delegate_write}?"write.gif":"nowrite.gif").qq(>&nbsp;Write</td>
#<td><img src=$NicToolClient::image_dir/perm-).($del->{delegate_delete}?"delete.gif":"nodelete.gif").qq(>&nbsp;Remove</td>
#<td><img src=$NicToolClient::image_dir/perm-).($del->{delegate_delegate}?"delegate.gif":"nodelegate.gif").qq(>&nbsp;Re-delegate</td>
                    . qq(
                            <td><img src=$NicToolClient::image_dir/perm-)
                    . (
                    $del->{delegate_write} ? "checked.gif" : "unchecked.gif" )
                    . qq(>&nbsp;Write</td>
                            <td><img src=$NicToolClient::image_dir/perm-)
                    . ( $del->{delegate_delete}
                    ? "checked.gif"
                    : "unchecked.gif" )
                    . qq(>&nbsp;Remove</td>
                            <td><img src=$NicToolClient::image_dir/perm-)
                    . ( $del->{delegate_delegate}
                    ? "checked.gif"
                    : "unchecked.gif" )
                    . qq(>&nbsp;Re-delegate</td>
                            <td><img src=$NicToolClient::image_dir/perm-)
                    . ( $del->{delegate_add_records}
                    ? "checked.gif"
                    : "unchecked.gif" )
                    . qq(>&nbsp;Add Records</td>
                            <td><img src=$NicToolClient::image_dir/perm-)
                    . ( $del->{delegate_delete_records}
                    ? "checked.gif"
                    : "unchecked.gif" )
                    . qq(>&nbsp;Delete Records</td>
                            </tr>
                            </table>
                        </td>
                        <td nowrap width=1%>
                            );

                if ( $nt_obj->no_gui_hints
                    || !$zone->{'deleted'} && $user->{zone_delegate} )
                {
                    print
                        "<a href=\"javascript:void window.open('delegate_zones.cgi?obj_list=$zone->{'nt_zone_id'}&nt_group_id=$del->{'nt_group_id'}&edit=1', 'delegate_win', 'width=640,height=480,scrollbars,resizable=yes')\">Edit</a>";
                }
                else {
                    print
                        "<font color=$NicToolClient::disabled_color>Edit</font>";
                }
                print qq{
                        </td>
                        <td nowrap width=1% align=center>
                            };

                if ( $nt_obj->no_gui_hints
                    || !$zone->{'deleted'} && $user->{zone_delegate} )
                {
                    print
                        "<a href='zone.cgi?nt_zone_id=$zone->{'nt_zone_id'}&nt_group_id="
                        . $q->param('nt_group_id')
                        . "&delegate_group_id=$del->{'nt_group_id'}&deletedelegate=1' onClick=\"return confirm('Are you sure you want to remove the delegation of zone $zone->{'zone'} to group $del->{'group_name'}?');\"><img src=$NicToolClient::image_dir/trash-delegate.gif border=0 alt='Remove Delegation'></a>";
                }
                else {
                    print
                        "<img src=$NicToolClient::image_dir/trash-delegate-disabled.gif border=0>";
                }

                print qq{
                        </td>
                    </tr>};
            }
            print qq{
                    </table>
                </td>
            </tr>
            </table>
            };

        }
    }

    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    print
        "<tr bgcolor=$NicToolClient::dark_grey><td><table cellpadding=0 cellspacing=0 border=0 width=100%>";
    print "<tr>";
    print "<td><b>Properties</b></td>";
    if ( $nt_obj->no_gui_hints
        || !$zone->{'deleted'}
        && $user->{'zone_write'}
        && ( $isdelegate ? $zone->{'delegate_write'} : 1 ) )
    {
        print "<td align=right><a href=zone.cgi?",
            join( '&', @state_fields ),
            "&nt_group_id="
            . $q->param('nt_group_id')
            . "&nt_zone_id=$zone->{'nt_zone_id'}&edit_zone=1>Edit</a></td>";
    }
    else {
        print
            "<td align=right><font color=$NicToolClient::disabled_color>Edit</font></td>";
    }
    print "</tr></table>";
    print "</td></tr></table>";

    print "<table cellpadding=2 cellspacing=0 border=0 width=100%>";
    print "<tr>";
    print "<td width=50%>";
    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    foreach (qw(zone mailaddr description serial minimum)) {
        print "<tr bgcolor=$NicToolClient::light_grey>";
        print "<td nowrap>", "$_: </td>";
        print "<td width=100%>",
            ( $zone->{$_} ? $zone->{$_} : '&nbsp;' ), "</td>";
        print "</tr>";
    }
    print "</table>";
    print "</td><td width=50% valign=top>";
    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    foreach (qw(refresh retry expire ttl )) {
        print "<tr bgcolor=$NicToolClient::light_grey>";
        print "<td nowrap>", "$_: </td>";
        print "<td width=100%>",
            ( $zone->{$_} ? $zone->{$_} : '&nbsp;' ), "</td>";
        print "</tr>";
    }

    print "</table>";
    print "</td></tr></table>";

    return $zone;
}

sub display_nameservers {
    my ( $nt_obj, $user, $q, $zone ) = @_;

    my $isdelegate = exists $zone->{'delegated_by_id'};
    my @state_fields;
    foreach ( @{ $nt_obj->paging_fields } ) {
        push( @state_fields, "$_=" . $q->escape( $q->param($_) ) )
            if ( $q->param($_) );
    }

    my @fields = qw(name address description);
    my %labels = (
        name        => 'name',
        address     => 'address',
        description => 'description'
    );

    print "<table cellpadding=2 cellspacing=0 border=0 width=100%>";
    print "<tr><td>";

    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    print
        "<tr bgcolor=$NicToolClient::dark_grey><td><table cellpadding=0 cellspacing=0 border=0 width=100%>";
    print "<tr>";
    print "<td><b>Nameservers</b></td>";
    if ( $nt_obj->no_gui_hints
        || !$zone->{'deleted'}
        && $user->{'zone_write'}
        && ( $isdelegate ? $zone->{'delegate_write'} : 1 ) )
    {
        print "<td align=right><a href=zone.cgi?",
            join( '&', @state_fields ),
            "&nt_group_id="
            . $q->param('nt_group_id')
            . "&nt_zone_id=$zone->{'nt_zone_id'}&edit_zone=1>Edit</a></td>";
    }
    else {
        print
            "<td align=right><font color=$NicToolClient::disabled_color>Edit</font></td>";
    }
    print "</tr></table>";
    print "</td></tr></table>";

    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    print "<tr bgcolor=$NicToolClient::dark_grey>";
    foreach (@fields) {
        print "<td align=center>",
            "$labels{$_}</td>";
    }
    print "</tr>";

    my $x = 1;
    foreach my $ns ( @{ $zone->{'nameservers'} } ) {
        print "<tr bgcolor=",
            ( $x++ % 2 == 0 ? $NicToolClient::light_grey : 'white' ), ">";
        foreach (@fields) {
            if ( $_ eq 'name' ) {
                print "<td><table cellpadding=0 cellspacing=0 border=0><tr>";
                print
                    "<td><img src=$NicToolClient::image_dir/nameserver.gif></td>";
                print "<td>",
                    ( $ns->{$_} ? $ns->{$_} : '&nbsp;' ), "</td>";
                print "</tr></table></td>";
            }
            else {
                print "<td>",
                    ( $ns->{$_} ? $ns->{$_} : '&nbsp;' ), "</td>";
            }
        }
        print "</tr>";
    }

    print "</table>";
    print "</td></tr></table>";
}

sub display_zone_records {
    my ( $nt_obj, $user, $q, $zone, $summary ) = @_;
    my $group = $nt_obj->get_group(
        nt_group_id  => $user->{'nt_group_id'},
        summary_data => 1
    );
    my $zonedelegate = exists $zone->{'delegated_by_id'};

# display any status messages regarding any previous actions
#    New Zone Record 'host.example.com' Created
    if ( $q->param('new_record') ) {
        if ( $q->param('Create') ) {
            my @fields
                = qw(nt_group_id nt_zone_id name type address weight priority other ttl description);
            my %data;
            foreach my $x (@fields) {
                $data{$x} = $q->param($x);
            }

            my $error = $nt_obj->new_zone_record(%data);
            if ( $error->{'error_code'} != 200 ) {
                &display_edit_record( $nt_obj, $user, $q, $error, $zone, 'new' );
            }
            else {
                $q->param(
                    -name  => 'new_record_id',
                    -value => $error->{'nt_zone_record_id'}
                );
                $nt_obj->display_nice_message(
                    "New Zone Record '$data{name}' Created",
                    "New Zone Record" );
# Debut jfdesir script for export
		create_zone();
##Fin jfdesir
            }
        }
        elsif ( $q->param('Cancel') ) {

            # do nothing
        }
        else {
            &display_edit_record( $nt_obj, $user, $q, "", $zone, 'new' );
        }
    }
#    Zone Record successfully modified
    if ( $q->param('edit_record') ) {
        if ( $q->param('Save') ) {
            my @fields
                = qw(nt_group_id nt_zone_id nt_zone_record_id name type address weight priority other ttl description deleted);
            my %data;
            foreach my $x (@fields) {
                $data{$x} = $q->param($x);
            }
            my $error = $nt_obj->edit_zone_record(%data);
            if ( $error->{'error_code'} != 200 ) {
                &display_edit_record( $nt_obj, $user, $q, $error, $zone,
                    'edit' );
            }
            else {
                $nt_obj->display_nice_message(
                    "Zone Record successfully modified.",
                    "Edit Zone Record" );
		    #jfdesir 
		    create_zone();
		    #fin jfdesir
            }
        }
        elsif ( $q->param('Cancel') ) {

            # do nothing
        }
        else {
            &display_edit_record( $nt_obj, $user, $q, "", $zone, 'edit' );
        }
    }
#    Zone Record successfully deleted.
    if ( $q->param('delete_record') ) {
        my $error = $nt_obj->delete_zone_record(
            nt_group_id       => $q->param('nt_group_id'),
            nt_zone_record_id => $q->param('nt_zone_record_id')
        );
        if ( $error->{'error_code'} != 200 ) {
            $nt_obj->display_nice_error( $error, "Delete Zone Record" );
        }
        else {
            $nt_obj->display_nice_message(
                "Zone Record successfully deleted.",
                "Delete Zone Record" );
		##jfdesir
		create_zone();
		#fin jfdesir
        }
    }

    my @columns = qw(name type address ttl weight priority other description);

    my %labels = (
        name        => 'Name',
        type        => 'Type',
        address     => 'Address',
        ttl         => 'TTL',
        weight      => 'Weight',
        priority    => 'Priority',
        other       => 'Port',
        description => 'Description',
    );

    $nt_obj->display_sort_options( $q, \@columns, \%labels, 'zone.cgi',
        [ 'nt_group_id', 'nt_zone_id' ] )
        if $q->param('edit_sortorder');
    $nt_obj->display_advanced_search( $q, \@columns, \%labels, 'zone.cgi',
        [ 'nt_group_id', 'nt_zone_id' ] )
        if $q->param('edit_search');

    my %params = ( nt_zone_id => $q->param('nt_zone_id') );
    my %sort_fields;
    $nt_obj->prepare_search_params( $q, \%labels, \%params, \%sort_fields, 20 );

    $sort_fields{'name'} = { 'order' => 1, 'mod' => 'Ascending' }
        unless %sort_fields;

    my $rv = $nt_obj->get_zone_records(%params);
    return $nt_obj->display_nice_error( $rv, "Get Zone Records" )
        if ( $rv->{'error_code'} != '200' );

    my $zone_records = $rv->{'records'};

    my @state_fields;
    foreach ( @{ $nt_obj->paging_fields } ) {
        push( @state_fields, "$_=" . $q->escape( $q->param($_) ) )
            if ( $q->param($_) );
    }

# Display the RR header: Resource Records  New Resource Record | View Resource Record Log
    my @options;
    if ($nt_obj->no_gui_hints
        || !$zone->{'deleted'}
        && $user->{'zonerecord_create'}
        && (  $zonedelegate
            ? $zone->{'delegate_write'} && $zone->{'delegate_add_records'}
            : 1 )
        )
    {
        push( @options,
                  "<a href=zone.cgi?" . join( '&', @state_fields )
                . "&nt_group_id="     . $q->param('nt_group_id')
                . "&nt_zone_id="      . $q->param('nt_zone_id')
                . "&new_record=1#RECORD>New Resource Record</a>" );
    }
    else {
        push( @options,
            "<font color=$NicToolClient::disabled_color>New Resource Record</font>"
        );
    }
    push( @options,
          "<a href=zone_record_log.cgi?" .
          "nt_group_id=" . $q->param('nt_group_id') .
          "&nt_zone_id=" . $q->param('nt_zone_id') . ">View Resource Record Log</a>" );

    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    print "<tr><td><hr></td></tr>";

    #show delegation information if delegated down

    print "<tr bgcolor=$NicToolClient::dark_grey><td>";
    print "<table cellpadding=0 cellspacing=0 border=0 width=100%>";
    print "<tr>";
    print "<td><b>Resource Records</b></td>";
    print "<td align=right>", join( ' | ', @options ),
        "</td>";
    print "</tr></table></td></tr>";
    print "</table>";

    $nt_obj->display_search_rows( $q, $rv, \%params, 'zone.cgi',
        [ 'nt_group_id', 'nt_zone_id' ] );

    if (@$zone_records) {

        # only show columns applicable to the records in the zone
        @columns = qw(name type address ttl );

        my %has_type;
        foreach my $r_record (@$zone_records) {
            $has_type{$r_record->{'type'}}++;
        };
        if ($has_type{'MX'} || $has_type{'SRV'} ) {
            push @columns, 'weight';
        };
        if ($has_type{'SRV'}) {
            push @columns, 'priority', 'other';
        };
        push @columns, 'description';


        print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
        print "<tr bgcolor=$NicToolClient::dark_grey>";
        foreach (@columns) {
            if ( $sort_fields{$_} ) {
                print
                    "<td bgcolor=$NicToolClient::dark_color align=center>" . 
                      "<table cellpadding=0 cellspacing=0 border=0>" .
                        "<tr>";
                print
                    "<td><font color=white>$labels{$_}</font></td>";
                print
                    "<td>&nbsp; &nbsp; <font color=white>",
                    $sort_fields{$_}->{'order'}, "</font></td>";
                print "<td><img src=$NicToolClient::image_dir/",
                    (
                    uc( $sort_fields{$_}->{'mod'} ) eq 'ASCENDING'
                    ? 'up.gif'
                    : 'down.gif' ), "></tD>";
                print "</tr></table></td>";

            }
            else {
                print "<td align=center>",
                    "$labels{$_}</td>";
            }
        }
        print
            "<td align=center width=1%><img src=$NicToolClient::image_dir/delegate.gif></td>";
        print
            "<td align=center width=1%><img src=$NicToolClient::image_dir/trash.gif></td>";
        print "</tr>";

        my $x = 0;
        my $range;
        my $isdelegate;
        my $img;
        my $hilite;
        my $bgcolor;
        foreach my $r_record (@$zone_records) {
            $range      = $r_record->{'period'};
            $isdelegate = exists $r_record->{'delegated_by_id'};
            $img        = $isdelegate ? '-delegated' : '';
            $bgcolor
                = ( $x++ % 2 == 0 ? $NicToolClient::light_grey : 'white' );
            $hilite = ( $x % 2 == 0
                ? $NicToolClient::light_hilite
                : $NicToolClient::dark_hilite );
            $bgcolor = $hilite
                if (
                $r_record->{'nt_zone_record_id'} eq $q->param('new_record_id')
                and $NicToolClient::hilite_new_zone_records );
            print "<tr bgcolor=$bgcolor>";
            $r_record->{name} = "@ ($zone->{'zone'})"
                if ( $r_record->{name} eq "@" );

            if (   uc( $r_record->{type} ) ne "MX"
                && uc( $r_record->{'type'} ) ne "SRV" )
            {
                $r_record->{weight} = "";  # showing n/a just cluttered the screen
            }

            # shorten theh max width of the address field (workaround for
            # display formatting problem with DomainKey entries.
            if ( length $r_record->{address} > 48 ) {
                my $max = 0;
                my @lines;
                while ( $max < length $r_record->{address} ) {
                    push @lines, substr( $r_record->{address}, $max, 48 );
                    $max += 48;
                }
                $r_record->{address} = join "<br>", @lines;
            }
            foreach (@columns) {
                if ( $_ eq 'name' ) {
                    print "<td><table cellpadding=0 cellspacing=0 border=0>";
                    print "<tr>";

                    print "<td>";
                    if ( !$zone->{'deleted'} ) {
                        print "<a href=zone.cgi?", join( '&', @state_fields ),
                            "&nt_zone_record_id=$r_record->{'nt_zone_record_id'}&nt_zone_id=$zone->{'nt_zone_id'}&nt_group_id="
                            . $q->param('nt_group_id')
                            . "&edit_record=1#RECORD><img src=$NicToolClient::image_dir/r_record$img.gif border=0></a>";
                    }
                    else {
                        print
                            "<img src=$NicToolClient::image_dir/r_record$img.gif border=0>";
                    }
                    print "</td>";
                    print "<td>";
                    if ( !$zone->{'deleted'} ) {
                        print "<a href=zone.cgi?",
                            join( '&', @state_fields ),
                            "&nt_zone_record_id=$r_record->{'nt_zone_record_id'}&nt_zone_id=$zone->{'nt_zone_id'}&nt_group_id="
                            . $q->param('nt_group_id')
                            . "&edit_record=1#RECORD>", $r_record->{$_},
                            "</a>";
                    }
                    else {
                        print $r_record->{$_};
                    }
                    if ( $r_record->{'delegated_by_id'} ) {
                        print
                            "&nbsp;&nbsp;<img src=$NicToolClient::image_dir/perm-"
                            . ( $r_record->{'delegate_write'}
                            ? 'write.gif'
                            : 'nowrite.gif' )
                            . " border=0>";
                    }
                    print "</td>";
                    print "</tr></table></td>";
                }
                elsif ( $_ =~ /address|ttl|weight|priority|other/i ) {
                    print '<td align="right">', ( $r_record->{$_} ? $r_record->{$_} : '&nbsp;' ), "</td>";
                }
                else {
                    print '<td align="center">', ( $r_record->{$_} ? $r_record->{$_} : '&nbsp;' ), "</td>";
                }
            }
            if ($nt_obj->no_gui_hints
                || !$zone->{'deleted'}
                && $group->{'has_children'}
                && $user->{'zonerecord_delegate'}
                && (  $isdelegate
                    ? $r_record->{'delegate_delegate'}
                    : ( $zonedelegate ? $zone->{'delegate_delegate'} : 1 ) )
                )
            {
                print
                    "<td align=center><a href=\"javascript:void window.open('delegate_zones.cgi?type=record&obj_list=$r_record->{'nt_zone_record_id'}&nt_zone_id=$r_record->{'nt_zone_id'}', 'delegate_win', 'width=640,height=480,scrollbars,resizable=yes')\"><img src=$NicToolClient::image_dir/delegate.gif border=0 alt='Delegate Resource Record'></a></td>";
            }
            else {
                print
                    "<td align=center><img src=$NicToolClient::image_dir/delegate-disabled.gif border=0></td>";
            }
            $img =~ s/.$//g;
            if ( $nt_obj->no_gui_hints
                || !$zone->{'deleted'}
                && $user->{'zonerecord_delete'}
                && !$isdelegate
                && ( $zonedelegate ? $zone->{'delegate_delete_records'} : 1 )
                )
            {
                print "<td align=center><a href=\"zone.cgi?",
                    join( '&', @state_fields ),
                    "&nt_zone_id=$zone->{'nt_zone_id'}&nt_group_id="
                    . $q->param('nt_group_id')
                    . "&nt_zone_record_id=$r_record->{'nt_zone_record_id'}&delete_record=$r_record->{'nt_zone_record_id'}\" onClick=\"return confirm('Are you sure you want to delete $zone->{'zone'} $r_record->{'type'} record $r_record->{'name'} that points to $r_record->{'address'} ?')\"><img src=$NicToolClient::image_dir/trash.gif border=0></a></td>";

#}elsif($isdelegate && $r_record->{'delegate_delete'}){
#    print "<td align=center><a href=\"zone.cgi?type=record&", join('&', @state_fields), "&nt_zone_id=$zone->{'nt_zone_id'}&nt_group_id=" . $q->param('nt_group_id') . "&nt_zone_record_id=$r_record->{'nt_zone_record_id'}&delegate_group_id=".$q->param("nt_group_id")."&deletedelegate=1\" onClick=\"return confirm('Are you sure you want to remove delegation of $zone->{'zone'} $r_record->{'type'} record $r_record->{'name'} that points to $r_record->{'address'} ?')\"><img src=$NicToolClient::image_dir/trash$img.gif border=0></a></td>";
            }
            else {
                print
                    "<td align=center><img src=$NicToolClient::image_dir/trash$img-disabled.gif border=0></td>";
            }
            print "</tr>";
        }

        print "</table>";

    }
}

sub display_edit_record {
    my ( $nt_obj, $user, $q, $message, $zone, $edit ) = @_;

    my $zone_record = { 'ttl' => 86400 };
    my $action = 'New';
    my $message2;

# is this a Save or Edit operation?
    if ( $q->param('nt_zone_record_id') && !$q->param('Save') )
    {    # get current settings

        if ( $q->param('nt_zone_record_log_id') ) {
            $action      = 'Recover';
            $zone_record = $nt_obj->get_zone_record_log_entry(
                nt_zone_record_id     => $q->param('nt_zone_record_id'),
                nt_zone_record_log_id => $q->param('nt_zone_record_log_id')
            );
        }
        else {
            $action      = 'Edit';
            $zone_record = $nt_obj->get_zone_record(
                nt_group_id       => $q->param('nt_group_id'),
                nt_zone_id        => $q->param('nt_zone_id'),
                nt_zone_record_id => $q->param('nt_zone_record_id')
            );
        }

        if ( $zone_record->{'error_code'} != 200 ) {
            $message2 = $zone_record;
        }
        else {
            $zone_record->{'name'} = $zone->{'zone'} . "."
                if ( $zone_record->{'name'} eq "@" && $zone->{'zone'} );
            $zone_record->{'address'} = $zone->{'zone'} . "."
                if ( $zone_record->{'address'} eq "@" && $zone->{'zone'} );
        }
    }
    my $isdelegate = exists $zone_record->{'delegated_by_id'};
    my $pseudo     = $zone_record->{'pseudo'};

    my ($type_values, $type_labels);
    # present RR types appropriate for the type of zone
    if ( $zone->{'zone'} =~ /in-addr\.arpa$/ ) {
        $type_values = [ sort keys %{ $nt_obj->rr_reverse_types() } ];
        $type_labels = $nt_obj->rr_reverse_types();
    } else {
        $type_values = [ sort keys %{ $nt_obj->rr_forward_types() } ];
        $type_labels = $nt_obj->rr_forward_types();
    };

#    use Data::Dumper;
#    warn Dumper $nt_obj->rr_types, "\n<br>";
#    warn Dumper $nt_obj->rr_forward_types, "\n<br>";
#    warn Dumper $nt_obj->rr_reverse_types, "\n<br>";

# does user have Edit permissions?
    my $modifyperm  = !$isdelegate && $user->{'zonerecord_write'}
        || $isdelegate
        && $user->{'zonerecord_write'}
        && $zone_record->{'delegate_write'};

    if ($modifyperm) {
        print $q->start_form( -action => 'zone.cgi', -method => 'POST', -name=>'rr_edit' ),
            $q->hidden( -name => $edit . '_record' ),
            $q->hidden( -name => 'nt_group_id' ),
            $q->hidden( -name => 'nt_zone_id' ), "\n";
        print $q->hidden( -name => 'nt_zone_record_id' ) if $edit eq 'edit';
        print $q->hidden( -name => 'nt_zone_record_log_id' );
        print $q->hidden( -name => 'deleted', -value => '0' )
            if $action eq 'Recover';

        foreach ( @{ $nt_obj->paging_fields } ) {
            print $q->hidden( -name => $_ );
        }
    }
    else {
        $action = 'View' if $action eq 'Edit';
    }

#print "<center><font color=red><b>$message</b></font></center>" if $message;
    $nt_obj->display_nice_error($message)  if $message;
    $nt_obj->display_nice_error($message2) if $message2;
    print "<a name='RECORD'>";
    print '<div class="dark_bg_color">Resource Record</div>';

# display delegation information
    if ( !$isdelegate && $edit ne 'new' ) {
        my $delegates = $nt_obj->get_zone_record_delegates(
            nt_zone_record_id => $zone_record->{'nt_zone_record_id'} );
        if ( $delegates->{error_code} ne 200 ) {
            warn
                "error get_zone_record_delegates(nt_zone_record_id=>$zone_record->{'nt_zone_record_id'}: "
                . $delegates->{'error_code'} . " "
                . $delegates->{'error_msg'};
        }
        elsif ( @{ $delegates->{'delegates'} } gt 0 ) {
            print qq{
            <table cellpadding=2 cellspacing=2 border=0 width=100%>
            <tr bgcolor=$NicToolClient::dark_grey>
                <td> Delegates</td>
            </tr>
            </table>

            <table cellpadding=2 cellspacing=0 border=0 width=100%>
            <tr>
                <td valign=top>
                    <table cellpadding=2 cellspacing=2 border=0 width=100%>

                    <tr bgcolor=$NicToolClient::light_grey>
                        <td nowrap> Group</td>
                        <td nowrap> Delegated By</td>
                        <td nowrap> Access Permissions}
                . $nt_obj->help_link('delperms') . qq{</td>
                        <td nowrap width=1%> Edit</td>
                        <td nowrap width=1% align=center><img src=$NicToolClient::image_dir/trash-delegate.gif></td>
                    </tr>
            };
            foreach my $del ( @{ $delegates->{'delegates'} } ) {
                print qq(
                    <tr bgcolor=$NicToolClient::light_grey>
                        <td nowrap valign=center>
                            <table><tr>
                            <td valign=center><a href=group.cgi?nt_group_id=$del->{'nt_group_id'}><img src=$NicToolClient::image_dir/group.gif border=0></a></td>
                            <td valign=center><a href=group.cgi?nt_group_id=$del->{'nt_group_id'}>$del->{'group_name'}</a></td>
                            </tr>
                            </table>
                        </td>
                        <td nowrap valign=center>
                            <table><tr>
                            <td valign=center><a href=user.cgi?nt_user_id=$del->{'delegated_by_id'}><img src=$NicToolClient::image_dir/user.gif border=0></a></td>
                            <td valign=center><a href=user.cgi?nt_user_id=$del->{'delegated_by_id'}>$del->{'delegated_by_name'}</a></td>
                            </tr>
                            </table>
                        </td>
                        <td nowrap>
                            <table><tr>)

#<td><img src=$NicToolClient::image_dir/perm-).($del->{delegate_write}?"write.gif":"nowrite.gif").qq(>&nbsp;Write</td>
#<td><img src=$NicToolClient::image_dir/perm-).($del->{delegate_delete}?"delete.gif":"nodelete.gif").qq(>&nbsp;Remove</td>
#<td><img src=$NicToolClient::image_dir/perm-).($del->{delegate_delegate}?"delegate.gif":"nodelegate.gif").qq(>&nbsp;Re-delegate</td>
                    . qq(
                            <td><img src=$NicToolClient::image_dir/perm-)
                    . (
                    $del->{delegate_write} ? "checked.gif" : "unchecked.gif" )
                    . qq(>&nbsp;Write</td>
                            <td><img src=$NicToolClient::image_dir/perm-)
                    . ( $del->{delegate_delete}
                    ? "checked.gif"
                    : "unchecked.gif" )
                    . qq(>&nbsp;Remove</td>
                            <td><img src=$NicToolClient::image_dir/perm-)
                    . ( $del->{delegate_delegate}
                    ? "checked.gif"
                    : "unchecked.gif" )
                    . qq(>&nbsp;Re-delegate</td>

                            </tr>
                            </table>
                        </td>
                        <td nowrap width=1%>
                            );
                if ( $nt_obj->no_gui_hints || $user->{zonerecord_delegate} ) {
                    print
                        "<a href=\"javascript:void window.open('delegate_zones.cgi?type=record&obj_list=$zone_record->{'nt_zone_record_id'}&nt_zone_id=$zone_record->{'nt_zone_id'}&nt_group_id=$del->{'nt_group_id'}&edit=1', 'delegate_win', 'width=640,height=480,scrollbars,resizable=yes')\">Edit</a>";
                }
                else {
                    print
                        "<font color=$NicToolClient::disabled_color>Edit</font>";
                }
                print qq{
                        </td>
                        <td nowrap width=1% align=center>
                            };

                if ( $nt_obj->no_gui_hints || $user->{zonerecord_delegate} ) {
                    print
                        "<a href='zone.cgi?type=record&nt_zone_record_id=$zone_record->{'nt_zone_record_id'}&nt_zone_id=$zone_record->{'nt_zone_id'}&nt_group_id="
                        . $q->param('nt_group_id')
                        . "&delegate_group_id=$del->{'nt_group_id'}&deletedelegate=1' onClick=\"return confirm('Are you sure you want to remove the delegation of resource record $zone_record->{'name'} to group $del->{'group_name'}?');\"><img src=$NicToolClient::image_dir/trash-delegate.gif border=0 alt='Remove Delegation'></a>";
                }
                else {
                    print
                        "<img src=$NicToolClient::image_dir/trash-delegate-disabled.gif border=0>";
                }

                print qq{
                        </td>
                    </tr>};
            }
            print qq{
                    </table>
                </td>
            </tr>
            </table>
            };

        }
    }
    elsif ( $edit ne 'new' && !$pseudo ) {
        print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
        print
            "<tr bgcolor=$NicToolClient::dark_grey><td><table cellpadding=0 cellspacing=0 border=0 width=100%>";
        print "<tr>";
        print "<td><b>Delegation</b></td>";
        print "</tr></table>";
        print "</td></tr></table>";

        print "<table cellpadding=2 cellspacing=0 border=0 width=100%>";
        print "<tr>";
        print "<td valign=top>";
        print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";

        print qq(
            <tr bgcolor=$NicToolClient::light_grey>
                <td nowrap> Delegated by: </td>
                <td width=100%>
                    <table>
                    <tr><td valign=center><img border=0 src=$NicToolClient::image_dir/user.gif></td>
                        <td valign=center> $zone_record->{'delegated_by_name'}</td>
                    </tr>
                    </table>
                </td>
            </tr>);

        print qq(
            <tr bgcolor=$NicToolClient::light_grey>
                <td nowrap> Belonging to group: </td>
                <td width=100%>
                    <table>
                        <tr>
                            <td valign=center><img border=0 src=$NicToolClient::image_dir/group.gif></td>
                            <td valign=center> $zone_record->{'group_name'}</td>
                        </tr>
                    </table>
                </td>
            </tr>);

        #print "</td><td width=50% valign=top>";
        print qq(
        <tr bgcolor=$NicToolClient::light_grey>
            <td nowrap> With Permissions: </td>
            <td width=100%>
                <table cellpadding=2 cellspacing=2 border=0>
                    <tr bgcolor=$NicToolClient::light_grey>);
        my %perms = (
            'write'  => "Write",
            'delete' => "Remove Delegation",
            delegate => "Re-delegate"
        );
        foreach (qw(write delete delegate)) {
            print "<td>";

#print "<img src=$NicToolClient::image_dir/perm-".($zone->{"delegate_$_"}?"$_.gif":"no$_.gif").">&nbsp;".$perms{$_};
            print "<img src=$NicToolClient::image_dir/perm-"
                . ( $zone_record->{"delegate_$_"}
                ? "checked.gif"
                : "unchecked.gif" )
                . ">&nbsp;"
                . $perms{$_};
            print "</td>";
        }
        print "</tr></table>";
        print "</td></tr>";
        print "</table>";
        print "</td></tr></table>";
        print qq(
            <table cellpadding=2 cellspacing=2 border=0 width=100%>
            <tr bgcolor=$NicToolClient::dark_grey>
                <td> Actions</td>
            </tr>
            </table>

            <table cellpadding=2 cellspacing=0 border=0 width=100%>
            <tr bgcolor=$NicToolClient::light_grey>
                <td align=left>
        );
        if (   $nt_obj->no_gui_hints
            || $user->{'zonerecord_delegate'}
            && $zone_record->{'delegate_delete'} )
        {
            print
                "<a href='zone.cgi?type=record&nt_zone_record_id=$zone_record->{'nt_zone_record_id'}&nt_zone_id=$zone_record->{'nt_zone_id'}&nt_group_id="
                . $q->param('nt_group_id')
                . "&delegate_group_id="
                . $q->param('nt_group_id')
                . "&deletedelegate=1' onClick=\"return confirm('Are you sure you want to remove the delegation of resource record $zone_record->{'name'} to group $zone_record->{'group_name'}?');\">Remove Delegation</a>";
        }
        else {
            print
                "<font color=$NicToolClient::disabled_color>Remove Delegation</font>";
        }
        print " | ";

        if (   $nt_obj->no_gui_hints
            || $user->{zone_write}
            && $user->{'zonerecord_delegate'}
            && $zone_record->{'delegate_delegate'} )
        {
            print
                "<a href=\"javascript:void window.open('delegate_zones.cgi?type=record&obj_list=$zone_record->{'nt_zone_record_id'}&nt_zone_id=$zone_record->{'nt_zone_id'}', 'delegate_win', 'width=640,height=480,scrollbars,resizable=yes')\">Re-Delegate</a>";
        }
        else {
            print
                "<font color=$NicToolClient::disabled_color>Re-Delegate</font>";
        }
        print qq(
                </td>
            </tr>
            </table>
        );

    }

    print qq{
  <table cellpadding=2 cellspacing=2 border=0 width=100%>
    <tr class="dark_grey_bg"><td colspan=2> $action </td></tr>
    <tr class="light_grey_bg">
      <td align="right"> Name:</td> },
     "<td width=100%>", $modifyperm ? $q->textfield(
        -name      => 'name',
        -size      => 40,
        -maxlength => 127,
        -default   => $zone_record->{'name'}
        ) : $zone_record->{'name'},
        ( $zone_record->{'name'} ne "$zone->{'zone'}."
        ? "<b>.$zone->{'zone'}.</b>"
        : "" ), "</td></tr>";

    my $default_record_type = $zone_record->{'type'};
    $default_record_type = 'PTR' if ( $zone->{'zone'} =~ /in-addr\.arpa/ );

    print qq{
    <tr class="light_grey_bg">
      <td align=right> Type:</td> },
     "<td width=100%>\n",
        $modifyperm
        ? $q->popup_menu(
#        ? $q->radio_group(
#        -linebreak => 'true',
            -name    => 'type',
            -id      => 'rr_type',
            -values  => $type_values,
            -labels  => $type_labels,
            -default => $default_record_type,
            -onClick => "show_rr_edit_rows(value)",  # not valid for popup menus (according to CGI.pm docs, but works
            -onChange => "show_rr_edit_rows(value)", # seems to work
            -onFocus => "show_rr_edit_rows(value)",  # run, darn it, even if user doesn't change value and onClick isn't permitted
        )
        : $type_labels->{ $zone_record->{'type'} }, "</td></tr>";

    print qq{
      <tr class="light_grey_bg">
        <td align="right"> Address:</td>
        <td width="100%">}, $modifyperm ? $q->textfield(
            -name      => 'address',
            -size      => 50,
            -maxlength => 255,
            -default   => $zone_record->{'address'},
        )
        : $zone_record->{'address'}, $nt_obj->help_link('rraddress') . 
      "</td></tr>";

    print qq{
       <tr id="tr_weight" class="light_grey_bg">
         <td align="right"> Weight:</td>
         <td width=100%>}, $modifyperm ? $q->textfield(
            -name      => 'weight',
            -size      => 5,
            -maxlength => 10,
            -default   => '10',
            -default   => $zone_record->{'weight'}
         ) : $zone_record->{'weight'}, 
       "</td></tr>";

    print qq{
       <tr id="tr_priority" class="light_grey_bg">
         <td align="right"> Priority:</td>
         <td width=100%>}, $modifyperm ? $q->textfield(
            -name      => 'priority',
            -size      => 5,
            -maxlength => 10,
            -default   => '10',
            -default   => $zone_record->{'priority'}
         ) : $zone_record->{'priority'}, 
       "</td></tr>";

    print qq{
       <tr id="tr_other" class="light_grey_bg">
         <td align="right"> Port:</td>
         <td width=100%>}, $modifyperm ? $q->textfield(
            -name      => 'other',
            -size      => 5,
            -maxlength => 10,
            -default   => '10',
            -default   => $zone_record->{'other'}
         ) : $zone_record->{'other'}, 
       "</td></tr>";

    print qq{
        <tr class="light_grey_bg">
          <td align="right"> TTL:</td>
          <td width="100%">},  $modifyperm ? $q->textfield(
                -name      => 'ttl',
                -size      => 5,
                -maxlength => 10,
                -default   => $zone_record->{'ttl'}
             )
                : $zone_record->{'ttl'}, 
           "</td></tr>";

    print qq{
        <tr class="light_grey_bg">
          <td align="right"> Trigramme & commentaires:</td>
          <td width="100%">}, $modifyperm ? $q->textfield(
                -name      => 'description',
                -size      => 60,
                -maxlength => 128,
                -default   => $zone_record->{'description'}
            )
            : $zone_record->{'description'} || "&nbsp;", 
          "</td></tr>";

    print qq{ <tr class="dark_grey_bg"><td colspan="2" align="center"> },
        $modifyperm ? $q->submit( $edit eq 'edit' ? 'Save' : 'Create' )
        . $q->submit('Cancel')
        : '&nbsp;', "</td></tr>";

    print "</table>";

    print $q->end_form if $modifyperm;
}

sub display_edit_zone {
    my ( $nt_obj, $user, $q, $message, $zone, $edit ) = @_;

    my $action;

    print $q->start_form(
        -action => 'zone.cgi',
        -method => 'POST',
        -name   => 'new_zone'
    );
    print $q->hidden( -name => 'nt_group_id' );
    print $q->hidden( -name => 'nt_zone_id' ) if $edit eq 'edit';
    print $q->hidden( -name => $edit . '_zone' );

    if ( $q->param('undelete') && $zone->{'deleted'} ) {
        $action = 'Recover';
        print $q->hidden( -name => 'undelete' );

    }
    else {
        $action = 'Edit';
    }

    foreach ( @{ $nt_obj->paging_fields() } ) {
        print $q->hidden( -name => $_ ) if ( $q->param($_) );
    }

    $nt_obj->display_nice_error($message) if $message;

#print "<center><font color=red><b>$message</b></font></center>" if $message;
    print "<a name='ZONE'>";
    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    print
        "<tr bgcolor=$NicToolClient::dark_color><td colspan=2><font color=white><b>$action Zone</b></font></td></tr>";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right>", "Zone:</td>";
    print "<td width=100%>",  $zone->{'zone'},
        "</td></tr>";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right valign=top>",
        "Nameservers:</td>";
    print "<td width=80%>\n";

    my %zone_ns
        = map { $_->{'nt_nameserver_id'}, 1 } @{ $zone->{'nameservers'} };

    # get list of available nameservers
    my $ns_tree = $nt_obj->get_usable_nameservers(
        nt_group_id      => $q->param('nt_group_id'),
        include_for_user => 1
    );
    warn "nt_group_id is " . $q->param('nt_group_id');

    foreach ( 1 .. scalar( @{ $ns_tree->{'nameservers'} } ) ) {
        last if ( $_ > 10 );

        my $ns = $ns_tree->{'nameservers'}->[ $_ - 1 ];

        print $q->checkbox(
            -name    => "nameservers",
            -checked => ( $zone_ns{ $ns->{'nt_nameserver_id'} } ? 1 : 0 ),
            -value   => $ns->{'nt_nameserver_id'},
            -label   => "$ns->{'description'} ($ns->{'name'})"
            ),
            "<BR>";
        delete $zone_ns{ $ns->{'nt_nameserver_id'} };
    }
    if ( @{ $ns_tree->{'nameservers'} } == 0 ) {
        print "No available nameservers.";
    }
    foreach ( keys %zone_ns ) {
        my $ns = $nt_obj->get_nameserver( nt_nameserver_id => $_ );
        print "<li>$ns->{'description'} ($ns->{'name'})<BR>";
    }
    print "</td></tr>\n";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right valign=top>",
        "Trigramme & Commentaires:</td>";
    print "<td width=80%>",
        $q->textarea(
        -name      => 'description',
        -cols      => 50,
        -rows      => 4,
        -maxlength => 255,
        -default   => $zone->{'description'}
        ),
        "</td></tr>";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right>", "TTL:</td>";
    print "<td width=80%>",
        $q->textfield(
        -name      => 'ttl',
        -size      => 8,
        -maxlength => 10,
        -default   => $zone->{'ttl'}
        );
    print
        "<input type=\"button\" value=\"Default\" onClick=\"this.form.ttl.value=$NicToolClient::default_zone_ttl\">",
        " $NicToolClient::default_zone_ttl";
    print "</td></tr>";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right>", "Refresh:</td>";
    print "<td width=80%>",
        $q->textfield(
        -name      => 'refresh',
        -size      => 8,
        -maxlength => 10,
        -default   => $zone->{'refresh'}
        );
    print
        "<input type=\"button\" value=\"Default\" onClick=\"this.form.refresh.value=$NicToolClient::default_zone_refresh\">",
        " $NicToolClient::default_zone_refresh", "</td></tr>";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right>", "Retry:</td>";
    print "<td width=80%>",
        $q->textfield(
        -name      => 'retry',
        -size      => 8,
        -maxlength => 10,
        -default   => $zone->{'retry'}
        );
    print
        "<input type=\"button\" value=\"Default\" onClick=\"this.form.retry.value=$NicToolClient::default_zone_retry\">",
        " $NicToolClient::default_zone_retry", "</td></tr>";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right>", "Expire:</td>";
    print "<td width=80%>",
        $q->textfield(
        -name      => 'expire',
        -size      => 8,
        -maxlength => 10,
        -default   => $zone->{'expire'}
        );
    print
        "<input type=\"button\" value=\"Default\" onClick=\"this.form.expire.value=$NicToolClient::default_zone_expire\">",
        " $NicToolClient::default_zone_expire", "</td></tr>";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right>", "Minimum:</td>";
    print "<td width=80%>",
        $q->textfield(
        -name      => 'minimum',
        -size      => 8,
        -maxlength => 10,
        -default   => $zone->{'minimum'}
        );
    print
        "<input type=\"button\" value=\"Default\" onClick=\"this.form.minimum.value=$NicToolClient::default_zone_minimum\">",
        " $NicToolClient::default_zone_minimum", "</td></tr>";

    print "<tr bgcolor=$NicToolClient::light_grey>";
    print "<td align=right>", "MailAddr:</td>";
    print "<td width=80%>",
        $q->textfield(
        -name      => 'mailaddr',
        -size      => 25,
        -maxlength => 255,
        -default   => $zone->{'mailaddr'}
        );
    print
        "<input type=\"button\" value=\"Default\" onClick=\"this.form.mailaddr.value='dnsmaster."
        . $zone->{'zone'}
        . ".'\">", " dnsmaster." . $zone->{'zone'} . ".",
        "</td></tr>";

    print
        "<tr bgcolor=$NicToolClient::dark_grey><td colspan=2 align=center>",
        $q->submit( $edit eq 'edit' ? 'Save' : 'Create' ),
        $q->submit('Cancel'), "</td></tr>";
    print "</table>";
    print $q->end_form;
}

sub display_summary {

    return unless $NicToolClient::display_summary_data;

    my $nt_obj = shift;
    my $q      = shift;
    my $group  = shift;
    my $data   = shift;

    my %labels = (
        zone_records              => 'Total Records',
        zone_record_additions     => 'Record Additions',
        zone_record_modifications => 'Record Modifications',
        zone_record_deletions     => 'Record Deletions',
    );

    my $width = '50%';

    $nt_obj->display_hr();

    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    print "<tr bgcolor=$NicToolClient::dark_grey><td>";
    print "<table cellpadding=0 cellspacing=0 border=0 width=100%>";
    print "<tr>";
    print "<td><b>Summary data for period "
        . ( scalar localtime( $data->{'range_start'} ) ) . " - "
        . ( scalar localtime( $data->{'range_end'} ) )
        . "</b></td></tr>";
    print "</tr></table></td></tr>";
    print "</table>";

    my @options;
    push( @options,
              "<a href=zone_application_log.cgi?nt_group_id="
            . $q->param('nt_group_id')
            . "&nt_zone_id="
            . $q->param('nt_zone_id')
            . ">View log</a>" );

    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    print "<tr bgcolor=$NicToolClient::dark_grey><td>";
    print "<table cellpadding=0 cellspacing=0 border=0 width=100%>";
    print "<tr>";
    print "<td>",
        "Zones application log summary</td>";
    print "<td align=right>", join( ' | ', @options ),
        "</td>";
    print "</tr>";
    print "</table></td></tr></table>";

    return $nt_obj->display_nice_error( $data, "Get Zone Summary" )
        if ( $data->{'error_code'} != 200 );

    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    print "<tr>";
    print "<td width=$width>";
    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    foreach (qw(zone_records zone_record_additions)) {
        print "<tr bgcolor=$NicToolClient::light_grey>";
        print "<td nowrap><font size=-2>",
            "$labels{$_}: </font></td>";
        print "<td width=100% align=right><font size=-2>",
            ( $data->{$_} ? $data->{$_} : 'n/a' ), "</font></td>";
        print "</tr>";
    }
    print "</table>";
    print "</td>";
    print "<td width=$width>";
    print "<table cellpadding=2 cellspacing=2 border=0 width=100%>";
    foreach (qw(zone_record_modifications zone_record_deletions)) {
        print "<tr bgcolor=$NicToolClient::light_grey>";
        print "<td nowrap><font size=-2>",
            "$labels{$_}: </font></td>";
        print "<td width=100% align=right><font size=-2>",
            ( $data->{$_} ? $data->{$_} : 'n/a' ), "</font></td>";
        print "</tr>";
    }
    print "</table>";
    print "</td>";
    print "</tr>";
    print "</table>";
}

###################################
#jfdesir 

sub create_zone 
{
 my $uth = $dbh->prepare("SELECT * FROM `nt_zone` WHERE `nt_zone_id` = '$zoneid'");
 $uth->execute;
 while(my @row = $uth->fetchrow_array()) {
	$domain=$row[2];
	$mail=$row[3];
	$serial=$row[5];
	$refresh=$row[6];
	$retry=$row[7];
	$expire=$row[8];
	$mini=$row[9];
	$ttl=$row[10];
#	$ns0id=$row[11];
#	$ns1id=$row[12];
#	$ns2id=$row[13];
#	$ns3id=$row[14];
}
$uth->finish();


# NS0
#my $uth_ns0 = $dbh->prepare("SELECT name FROM nt_nameserver WHERE `nt_nameserver_id` = '$ns0id'");
#$uth_ns0->execute;
#while(my @row0 = $uth_ns0->fetchrow_array()) {
#	#my $ns0=$row0[0];
#	$ns0=$row0[0];
#}
#$uth_ns0->finish();
#
###NS1
#my $uth_ns1 = $dbh->prepare("SELECT name FROM nt_nameserver WHERE `nt_nameserver_id` = '$ns1id'");
#$uth_ns1->execute;
#while(my @row1 = $uth_ns1->fetchrow_array()) {
#	#my $ns1=$row1[0];
#	$ns1=$row1[0];
#}
#$uth_ns1->finish();
#
#
###NS2
#my $uth_ns2 = $dbh->prepare("SELECT name FROM nt_nameserver WHERE `nt_nameserver_id` = '$ns2id'");
#$uth_ns2->execute;
#while(my @row2 = $uth_ns2->fetchrow_array()) {
#	#my $ns2=$row2[0];
#	$ns2=$row2[0];
#}
#$uth_ns2->finish();

##NS3
#my $uth_ns3 = $dbh->prepare("SELECT name FROM nt_nameserver WHERE `nt_nameserver_id` = '$ns3id'");
#$uth_ns3->execute;
#while(my @row3 = $uth_ns3->fetchrow_array()) {
#	#my $ns3=$row3[0];
#	$ns3=$row3[0];
#}
#$uth_ns3->finish();

#################################################################
	$chemin = "PATH";
	$server = "PRIMARYIPSERVER";
	$ns0="PRIMARYFQDNSERVER";
	$ns1="SECONDARYFQDNSERVER";
	$ns2="THIRDFQDNSERVER";
	$soa = $ns0;
	dom_stamp();
	if (-e "$work_dir/$chemin/zones/masters/$domain"){
		copy("$work_dir/$chemin/zones/masters/$domain","$work_dir/$chemin/zones/archives/$domain\.$date");
	}
	open (FILE, ">$work_dir/$chemin/zones/masters/$domain");

print FILE <<EOF;
\$TTL	$ttl
\@	IN	SOA	$soa	$mail(
		$serial
		$refresh
		$retry
		$expire
		$mini)
	IN	NS	$ns0
	IN	NS	$ns1
	IN	NS	$ns2
EOF
		close (FILE);
		maj_record();
		newzone();
		newzone_slave();
		}

################################################################
sub maj_record 
{
 my $uth_rec = $dbh->prepare("SELECT name,ttl,type,address,weight FROM nt_zone_record WHERE `nt_zone_id` = '$zoneid' AND `deleted` = '0'");
 $uth_rec->execute;
 while(my @row_rec = $uth_rec->fetchrow_array()) {
 	open (FILE, ">>$work_dir/$chemin/zones/masters/$domain");
	if ( "$row_rec[2]" eq "MX"){ 
		print FILE "$row_rec[0]\t$row_rec[1]\tIN\t$row_rec[2]\t$row_rec[4]  $row_rec[3]\n";
	}else{
	        $row_rec[3]=~ s/\\072/:/g;
		print FILE "$row_rec[0]\t$row_rec[1]\tIN\t$row_rec[2]\t$row_rec[3]\n";
	}
 }
 close (FILE);
$uth_rec->finish();
}


############################################################

sub newzone 
{
copy("$work_dir/$chemin/etc/masters.inc","$work_dir/$chemin/etc/archives/masters.inc.$date");
my $conf="$work_dir/$chemin/etc/masters.inc";
my @TABCONF = ();
#my $newdom = "zone \"$domain\" \{ type master\; allow-query \{ can_query\; \}\; allow-transfer \{ can_axfr\; \}\; file \"masters\/$domain\"\; notify explicit\; \}\;\n";
my $newdom = "zone \"$domain\" \{ type master\; allow-query \{ can_query\; \}\; allow-transfer \{ can_axfr\; \}\; file \"masters\/$domain\"\; \}\;\n";

# recheche de la présence de ce domaine dans le fichier de conf
open (CONF, "$conf") or die "Can't open this file";
foreach (<CONF>){
	push (@TABCONF,$_);
	}
close (CONF);
#if (grep (/$newdom/, @TABCONF)){
if (grep (/\"$domain\"/, @TABCONF)){
#	print "Fichier de configuration (named.conf)  OK\n";
	}
	else {
		open (CONF, ">$conf");
		push (@TABCONF,$newdom);
		print CONF @TABCONF;	
		close (CONF);
	}
}
############################################################

sub newzone_slave
{
copy("$work_dir/$chemin/etc/slaves.inc","$work_dir/$chemin/etc/archives/slaves.inc.$date");
my $slaveconf="$work_dir/$chemin/etc/slaves.inc";
my @TABSLAVE = ();
my $newslave = "zone \"$domain\" \{ type slave\; allow-query \{ can_query\; \}\; allow-transfer \{ can_axfr\; \}\; file \"slaves\/$domain\"\; masters \{ $server\;\}\; \}\;\n";

# recheche de la présence de ce domaine dans le fichier de conf
open (SLAVE, "$slaveconf") or die "Can't open this file";
foreach (<SLAVE>){
	push (@TABSLAVE,$_);
	}
close (SLAVE);
#if (grep (/$newslave/, @TABSLAVE)){
if (grep (/\"$domain\"/, @TABSLAVE)){
#	print "Fichier de configuration (named.conf)  OK\n";
	}
	else {
		open (SLAVE, ">$slaveconf");
		push (@TABSLAVE,$newslave);
		print SLAVE @TABSLAVE;	
		close (SLAVE);
	}
}

############################################################
# fichier stamp pour l'export crontab est zones
sub dom_stamp
{
$stamp="$work_dir/$chemin/zones/stamp/$domain\.stamp";
if (! -e $stamp){
	open (STAMP, ">$stamp") or die "Can't open $stamp";
	#print STAMP $domain;
	close (STAMP);
	sleep (1);
	}
}
############################################################
#find jfdesir

