The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package HTML::GUI::select;

use warnings;
use strict;

=head1 NAME

HTML::GUI::select - Create and control a select input for webapp

=head1 VERSION

Version 0.01

=cut

our $VERSION = '0.01';


use HTML::GUI::input;
our @ISA = qw(HTML::GUI::input);

=head1 SELECT

The select widget is made for choose an item in limited list.

=cut


# Define the specific default values for a select widget
my %GHW_defaultValue = (options => []);

#array of string : list of all specifric public properties of the widget
my @GHW_publicPropList = qw/options/;

=head1 PUBLIC ATTRIBUTES

=pod 



=cut


=head1 PUBLIC METHODS

=pod 

=head3 new

=cut

sub new
{
  my($class,
     $params, # widget : 
    ) = @_;
		$params->{type} = "select";
		my $this = $class->SUPER::new($params);
		if (!$this){
				return undef;
		}
		$this->{options} = [];

    bless($this, $class);
		if (exists $params->{options}){
				$this->setOptions($params->{options});
		}
		return $this;
}

=pod

=head3 isNewValue
  Description :
		return 1 if the value already exist in the widget's options
		else return 0

  parameter :
	  the newValue (scalar) to test
=cut

sub isNewValue($$)
{
		my ($this,$newValue) = @_;

		foreach my $option (@{$this->{options}}){
				if ($newValue eq $option->{value}){
						return 0;
				}
		}

		return 1;
}

=pod 

=head3 setOptions

   Description : 
      Define the options of the select box.

		parameters :
				$options is a ref to an array of hash ref
				[{	value		=>	"myvalue",
						label		=>	"my label},
				 {	value		=>	"myvalue2",
						label		=>	"my second label}]
=cut

sub setOptions
{
		my ($this,$options) = @_;
		if (!$options || ref $options ne 'ARRAY'){
		  $this->error("priv",{
								type=>'incorrect use of API',
								'explanation' => '$option should be an ARRAY ref',
								option => $options});
				
		}
		foreach my $oneOption (@$options){
				if (ref $oneOption ne "HASH"
								|| !exists $oneOption->{value}
								|| !exists $oneOption->{label}){
						#wrong data structure !!
						$this->error("priv",{
							type=>'incorrect use of API',
							'explanation' => '$oneOption should be a hash ref '
																	.'with ˝value" and "label" keys',
							option => $oneOption});
						next;

				}
				$oneOption->{value} ||= '';
				$oneOption->{label} ||= '';
				if (!$this->isNewValue($oneOption->{value}) ){
						#value already used !!!
						$this->error("priv",{
									type=>'incorrect use of API',
									'explanation' => 'the value of $oneOption is already '
																			.'present in the widget',
									option => $oneOption});
						next;
				}
				push @{$this->{options}} , $oneOption; 
		}

}

=pod 

=head3 getDefinitionData
  
  This method is the specialisation of the widget.pm method, refer to the widget.pm manual for more information.

=cut
sub getDefinitionData($)
{
  my ($self) = @_;

		my $publicProperties = $self->SUPER::getDefinitionData();
		 
		return $self->SUPER::getDefinitionData($publicProperties,
														\%GHW_defaultValue,\@GHW_publicPropList);
}


=pod 

=head3 getNudeHtml

   Description : 
      Return the html of the widget to be inserted in a <p> tag or a a table.

=cut

sub getNudeHtml
{
  my($self) = @_;
	my %tagProp=();
	my %styleProp=();
  

	if (exists $self->{display} && 0==$self->{display}){
		$styleProp{display} = 'none';
	}

	$tagProp{style} = $self->getStyleContent(\%styleProp);
	$tagProp{name} = $tagProp{id} = $self->{id};
	$tagProp{size} = '1';

	my $optionHtml = '';
	my $currentValue = $self->getValue();
	foreach my $option (@{$self->{options}}){
			my $optionProp = {};

			if (defined $currentValue
					&& ($currentValue eq $option->{value})){
				$optionProp->{selected} = 'selected';
			}
			$optionProp->{value} = $option->{value};

			$optionHtml .= $self->getHtmlTag("option",
																		$optionProp,
																		$self->escapeHtml($option->{label}));
																										
	}
  
  return $self->getHtmlTag("select", \%tagProp,$optionHtml);
}


=head1 AUTHOR

Jean-Christian Hassler, C<< <jhassler at free.fr> >>

=head1 BUGS

Please report any bugs or feature requests to
C<bug-gui-libhtml-select at rt.cpan.org>, or through the web interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=HTML-GUI-widget>.
I will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc HTML::GUI::widget

You can also look for information at:

=over 4

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/HTML-GUI-widget>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/HTML-GUI-widget>

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=HTML-GUI-widget>

=item * Search CPAN

L<http://search.cpan.org/dist/HTML-GUI-widget>

=back

=head1 ACKNOWLEDGEMENTS

=head1 COPYRIGHT & LICENSE

Copyright 2007 Jean-Christian Hassler, all rights reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=cut

1; # End of HTML::GUI::select