# $Id: DateEntry.pm,v 1.3 2000/11/07 15:47:28 kennedyh Exp $
=head1 NAME
HTML::Widgets::DateEntry - creates date entry widgets for HTML forms.
=head1 SYNOPSIS
use HTML::Widgets::DateEntry;
$de = new HTML::Widgets::DateEntry(
year => ['date_year', $date_year],
month => ['date_month', $date_month],
day => ['date_day', $date_day],
separator => '/',
pre_year => 1,
post_year => 1,
-iso => 1,
);
print $de->render_widget;
=head1 DESCRIPTION
HTML::Widgets::DateEntry is a simple module to generate HTML date entry widgets.
Currently generates widgets that look like:
[YYYY]/[MM]/[DD]
Will be able to generate
[MM]/[DD]/[YYYY]
[YYYY]/[MM]
[MM]/[YYYY]
[YYYY]
=over 8
=cut
package HTML::Widgets::DateEntry;
require 5;
use strict;
use vars qw($VERSION @EXPORT_OK %EXPORT_TAGS @ISA);
use Carp;
require Exporter;
@ISA = qw(Exporter);
$VERSION = (split / /, q$Id: DateEntry.pm,v 1.3 2000/11/07 15:47:28 kennedyh Exp $ )[2];
%EXPORT_TAGS = ( );
@EXPORT_OK = qw(&render_widget);
# prototypes
#
sub new (% ); # XXX?
sub render_widget ();
sub _year_frag ($$$$ );
sub _month_frag ($$ );
sub _day_frag ($$ );
# defaults
#
my $DEFAULT_SEPARATOR = '/';
my $DEFAULT_PRE_YEAR = 1;
my $DEFAULT_POST_YEAR = 1;
################
#
=pod
=item new(% );
Use like
$de = new HTML::Widgets::DateEntry(year => ['date_year',$year], month => ['date_month',$month], day => ['date_day',$day]);
returns a date entry widget object
with the fields named as specified.
if defaults are not provided, values from localtime will be used.
this will get better :-)
=cut
#
#################
sub new (% ) {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
my (%params) = @_;
my($year_field_name, $month_field_name, $day_field_name) = map { $_->[0] } @params{'year','month','day'};
my($year_field_default, $month_field_default, $day_field_default) = map { $_->[1] } @params{'year','month','day'};
$self = {
year_field_name => $year_field_name,
month_field_name => $month_field_name,
day_field_name => $day_field_name,
year_field_default => $year_field_default,
month_field_default => $month_field_default,
day_field_default => $day_field_default,
separator => $params{separator},
pre_year => $params{pre_year},
post_year => $params{post_year},
-iso => $params{-iso},
-us => $params{-us},
};
# XXX need some sanity checking on {pre,post}_year & friends.
# need to enforce consistency where needed.
$self->{separator} ||= $DEFAULT_SEPARATOR;
$self->{pre_year} = $DEFAULT_PRE_YEAR unless defined $self->{pre_year};
$self->{post_year} = $DEFAULT_POST_YEAR unless defined $self->{post_year};
if ( $self->{-us} and $self->{-iso} ) {
$self->{-us} = undef;
$self->{-iso} = 1;
}
unless ( $self->{-us} or $self->{-iso} ) {
$self->{-iso} = 1;
}
bless ($self, $class);
return $self;
}
################
#
=pod
=item render_widget()
Use like
print $de->render_widget;
returns a string representing an HTML date entry widget.
with the fields named as specified, and defaults set as specified
when the object was created.
this will get better :-)
=cut
#
#################
sub render_widget () {
my ($self) = shift;
my ($year_field_name, $month_field_name, $day_field_name)
= @{$self}{'year_field_name', 'month_field_name', 'day_field_name'};
my ($year_field_default, $month_field_default, $day_field_default)
= @{$self}{'year_field_default', 'month_field_default', 'day_field_default'};
my $separator = $self->{separator};
my $pre_year = $self->{pre_year};
my $post_year = $self->{post_year};
my $iso = $self->{-iso};
my @fragment;
unless ( $year_field_default && $month_field_default ) {
my ($day,$month,$year) = (localtime)[3,4,5];
$year += 1900;
$month++;
($year_field_default, $month_field_default, $day_field_default) = ($year,$month,$day);
}
if ( $iso ) { # YYYY/MM[/DD]
@fragment = &_year_frag($year_field_name, $year_field_default, $pre_year, $post_year);
if ( $month_field_name ) {
push @fragment, &_month_frag($month_field_name, $month_field_default);
}
if ( $day_field_name ) {
push @fragment, &_day_frag($day_field_name, $day_field_default);
}
} else { # MM[/DD]/YYYY
if ( $month_field_name ) {
@fragment = &_month_frag($month_field_name, $month_field_default);
}
if ( $day_field_name ) {
push @fragment, &_day_frag($day_field_name, $day_field_default);
}
push @fragment, &_year_frag($year_field_name, $year_field_default, $pre_year, $post_year);
}
return join $separator, @fragment;
}
################
#
#=pod
#
#=item _year_frag ($$$$ )
#
#Use like
# $yf = _year_frag('year',2000,1,1);
#
#returns a year entry widget
#with the fields named as specified.
#
#=cut
#
#################
sub _year_frag ($$$$ ) {
my ($year_field_name, $year_field_default, $pre_year, $post_year) = @_;
my (@fragment, $selected);
push @fragment, qq{\n};
return join "", @fragment;
}
################
#
#=pod
#
#=item _month_frag ($$ )
#
#Use like
# $mf = _month_frag('month',11);
#
#returns a month entry widget
#with the fields named as specified.
#
#=cut
#
#################
#
# XXX should we do month names? (long, abbr.)
#
sub _month_frag ($$ ) {
my ($month_field_name, $month_field_default) = @_;
my (@fragment, $selected);
push @fragment, qq{\n};
return join "", @fragment;
}
################
#
#=pod
#
#=item _day_frag ($$ )
#
#Use like
# $df = _day_frag('day',03);
#
#returns a day entry widget
#with the fields named as specified.
#
#=cut
#
#################
sub _day_frag ($$ ) {
my ($day_field_name, $day_field_default) = @_;
my (@fragment, $selected);
push @fragment, qq{\n";
return join "", @fragment;
}
=pod
=back
=head1 COPYRIGHT
COPYRIGHT 2000 THE REGENTS OF THE UNIVERSITY OF MICHIGAN
ALL RIGHTS RESERVED
PERMISSION IS GRANTED TO USE, COPY, CREATE DERIVATIVE WORKS
AND REDISTRIBUTE THIS SOFTWARE AND SUCH DERIVATIVE WORKS FOR
NON-COMMERCIAL EDUCATION AND RESEARCH PURPOSES, SO LONG AS NO
FEE IS CHARGED, AND SO LONG AS THE COPYRIGHT NOTICE ABOVE,
THIS GRANT OF PERMISSION, AND THE DISCLAIMER BELOW APPEAR IN
ALL COPIES MADE; AND SO LONG AS THE NAME OF THE UNIVERSITY
OF MICHIGAN IS NOT USED IN ANY ADVERTISING OR PUBLICITY
PERTAINING TO THE USE OR DISTRIBUTION OF THIS SOFTWARE
WITHOUT SPECIFIC, WRITTEN PRIOR AUTHORIZATION.
THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION AS
TO ITS FITNESS FOR ANY PURPOSE, AND WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT
LIMITATION THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE. THE REGENTS OF THE
UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE FOR ANY DAMAGES,
INCLUDING SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR IN
CONNECTION WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN
OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
( This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself. )
=head1 SEE ALSO
perl(1)
=head1 AUTHOR
Hugh Kennedy
__| \ __| \ |
( _ \ _| . |
\___|_/ Web Systems
=cut
'utterly false';