package Web::Canvas::Form;

use strict;
use warnings;

use Web::Canvas;

use base qw/Web::Canvas/;

sub new {
	my ($class, $canvas, $action, $form_class) = @_;
	my $self = bless {
		app => $canvas->app,
		canvas => $canvas,
		action => $action,
		container => undef,
		content => [],
		class => undef,
		form_class => $form_class,
	}, $class;
	
	return $self;
}

sub canvas { $_[0]->{canvas} }
sub action { $_[0]->{action} }
sub container { $_[0]->{container} }
sub language { $_[0]->canvas->{language} }
sub level { $_[0]->canvas->{level} }
sub param { $_[0]->app->controller->params->{$_[1]} }
sub form_class { defined $_[0]->{form_class} ? (class => $_[0]->{form_class})
	: () }
sub title { undef }
sub heading { undef }

sub set_container { $_[0]->{container} = $_[1]; $_[0] }
sub set_language { die 'Cannot set language on forms' }
sub set_title { die 'Cannot set title on forms' }
sub set_heading { die 'Cannot set heading on forms' }

sub has_error {
	my ($self, $name) = @_;
	my @errors = $self->app->cgi->param('errors');
	
	for my $error (@errors) {
		return 1 if $name eq $error;
	}
	
	return 0;
}

sub push_content {
	my ($self, @stuff) = @_;
	
	push @{$self->content}, @stuff;
	
	for my $thing (@stuff) {
		if (ref $thing eq 'ARRAY') {
			$self->set_container($thing);
		}
		else {
			$self->set_container(undef);
		}
	}
	
	return $self;
}

sub push_container {
	my ($self, @stuff) = @_;
	
	for my $thing (@stuff) {
		if (defined $self->container && defined ref $thing 
			&& ref $thing eq 'ARRAY') {
			push @{$self->container}, ' ', $thing;
			next;		
		}

		$self->push_content($thing);
	}
	
	return $self;
}

sub href {
	my ($self) = @_;
	
	return $self->app->cgi->script_name.$self->app->cgi->path_info;
}

sub add_text_field {
	my ($self, $name, $value, $size) = @_;
	my $param = $self->param($name);
	my $class = $self->has_error($name) ? [class => 'error'] : [];
	
	$self->push_container(
		[input => {
			@$class,
			name => $name, 
			value => $param || $value,
			defined $size ? (size => $size) : (),
		}],
	);
	
	return $self;
}

sub add_button {
	my ($self, $value) = @_;
	
	$self->push_container([input => {type => 'submit', value => $value}]);
	
	return $self;
}

sub add_image {
	my ($self, $src, $alt, $title) = @_;
	
	$self->push_container([input => {
		type => 'image',
		src => $src,
		alt => $alt,
		title => $title,
	}]);
	
	return $self;
}

sub add_hidden {
	my ($self, $name, $value) = @_;
	
	$self->push_content($self->create_hidden($name => $value));
	
	return $self;
}

sub create_hidden {
	my ($self, $name, $value) = @_;
	
	return [input => {type => 'hidden', name => $name, value => $value}];
}

sub structure {
	my ($self) = @_;
	
	return (
		[form => {action => $self->href, method => 'post', $self->form_class},
			[div => 
				$self->create_hidden(action => $self->action),
				$self->content_structure,
			],
		],
	);
}

1;
