package HTML::FormWidgets::Table;

# @(#)$Id: Table.pm 26 2008-03-24 19:14:41Z pjf $

use strict;
use warnings;
use base qw(HTML::FormWidgets);

use version; our $VERSION = qv( sprintf '0.1.%d', q$Rev: 26 $ =~ /\d+/gmx );

sub _render {
   my ($me, $ref) = @_; my ($fld, $r_no, $rows, $text, $text1, $tip, $val);

   my $cells      = q();
   my $c_no       = 0;
   my $def_class  = $me->class || q(small table);
   my $data       = $me->data  || { flds => [], values => [] };
   my $htag       = $me->elem;

   $me->select( q() ) unless (defined $me->select);

   if ($me->select eq q(left)) {
      $ref           = { class => $def_class };
      $ref->{class} .= $me->edit ? q( select) : q( minimal);
      $cells        .= $htag->th( $ref, 'Select' );
   }

   for $fld (@{ $data->{flds} }) {
      $ref = { class => $def_class };

      if (exists $data->{hclass}->{ $fld }) {
         next if ($data->{hclass}->{ $fld } eq q(hide));

         $ref->{class} .= q( ).$data->{hclass}->{ $fld };
      }

      $ref->{class} .= q( nowrap) unless (exists $data->{wrap}->{ $fld });
      $cells        .= $htag->th( $ref, $data->{labels}->{ $fld } );
      $c_no++;
   }

   if ($me->select eq q(right)) {
      $ref           = { class => $def_class };
      $ref->{class} .= $me->edit ? q( select) : q( minimal);
      $cells        .= $htag->th( $ref, 'Select' );
   }

   $rows = $htag->tr( $cells ); $r_no = 0;

   for $val (@{ $data->{values} }) {
      $cells = q(); $c_no = 0;

      if ($me->select eq q(left) and $data->{values}->[0]) {
         $cells .= $me->_checkBox( $r_no, $c_no, $val );
      }

      for $fld (@{ $data->{flds} }) {
         if ($me->edit) {
            $ref              = {};
            $ref->{default  } = $val->{ $fld };
            $ref->{maxlength} = $data->{maxlengths}->{ $fld }
               if (exists $data->{maxlengths}->{ $fld });
            $ref->{name     } = $fld.$r_no;
            $ref->{size     } = exists $data->{sizes}->{ $fld }
                              ? $data->{sizes}->{ $fld } : 10;
            $text             = $htag->textfield( $ref );
            $ref              = { class => q(dataValue) };
            $ref->{class}    .= q( nowrap)
               unless (exists $data->{wrap}->{ $fld });
            $cells           .= $htag->td( $ref, $text );
         }
         else {
            next if ($data->{hclass}->{ $fld }
                     and $data->{hclass}->{ $fld } eq q(hide));

            $ref              = {};
            $ref->{align}     = exists $data->{align}->{ $fld }
                              ? $data->{align}->{ $fld } : q(left);

            if ($val->{class} and exists $val->{class}->{ $fld }) {
               $ref->{class}  = $val->{class}->{ $fld };
            } else {
               $ref->{class}  = $c_no % 2 == 0 ? q(even) : q(odd);
               $ref->{class} .= q( ).($data->{class} || q(dataValue));
            }

            $ref->{class}    .= q( nowrap)
               unless (exists $data->{wrap}->{ $fld });
            $cells .= $htag->td( $ref, $val->{ $fld } || q( ) )."\n";
         }

         $c_no++;
      }

      if ($me->select eq q(right) and $data->{values}->[0]) {
         $cells .= $me->_checkBox( $r_no, $c_no, $val );
      }

      $ref   = { id => q(row).$me->name.$r_no };
      $rows .= $htag->tr( $ref, $cells ); $r_no++;
   }

   push @{ $me->hide }, { name => q(nRows).$me->name, value => $r_no };

   if ($me->edit) {
      $cells = q();

      for $c_no (0 .. $#{ $data->{flds} }) {
         $fld              = $data->{flds}->[ $c_no ];
         $ref              = { id => q(add).$me->name.$c_no };
         $ref->{maxlength} = $data->{maxlengths}->{ $fld }
            if (exists $data->{maxlengths}->{ $fld });
         $ref->{name     } = $fld;
         $ref->{size     } = exists $data->{sizes}->{ $fld }
                           ? $data->{sizes}->{ $fld } : 10;
         $text             = $htag->textfield( $ref );
         $cells           .= $htag->td( $text );
      }

      $ref            = {};
      $ref->{class  } = $ref->{name} = q(button);
      $ref->{onclick} = 'return tableObj.AddTableRow(\''.$me->name.'\', 1)';
      $ref->{src    } = $me->assets.'AddItem.png';
      $ref->{value  } = q(add).(ucfirst $me->name);
      $text           = $htag->image_button( $ref );
      $tip            = 'Enter a new item into the adjacent text ';
      $tip           .= 'fields and then click this button to add ';
      $tip           .= 'it to the list';
      $ref            = { class => q(help tips), title => $tip };
      $text           = $htag->span( $ref, $text );

      if ($me->select) {
         $ref            = {};
         $ref->{class  } = $ref->{name} = q(button);
         $ref->{onclick} = 'return tableObj.RemoveTableRow(\''.$me->name.'\')';
         $ref->{src    } = $me->assets.'RemoveItem.png';
         $ref->{value  } = q(remove).(ucfirst $me->name);
         $text1          = $htag->image_button( $ref );
         $tip            = 'Select one or more items from the ';
         $tip           .= 'above list and then click this button ';
         $tip           .= 'to remove them';
         $ref            = { class => q(help tips), title => $tip };
         $text          .= $htag->span( $ref, $text1 );
      }

      $cells .= $htag->td( $text );
      $rows  .= $htag->tr( { id => q(add).$me->name }, $cells );
   }

   return $htag->table( { class => ($me->prompt ? q(form) : q(std))}, $rows );
}

# Private methods

sub _checkBox {
   my ($me, $r_no, $c_no, $val) = @_; my ($text, $ref);

   $ref  = { name => 'select'.$me->name.$r_no };
   $ref->{value} = $val->{id} if ($val->{id});
   $text = $me->elem->checkbox( $ref );
   $ref  = { align => 'center', class => ($c_no % 2 == 0 ? 'even' : 'odd') };
   return $me->elem->td( $ref, $text );
}

1;

# Local Variables:
# mode: perl
# tab-width: 3
# End: