package PVE::HTMLForm;
use strict;
use HTML::Entities;
use PVE::I18N;
use PVE::HTMLTable;
sub new {
my ($type, $formdata, $name) = @_;
my $self = {};
$self->{formdata} = $formdata;
$self->{elements} = 0;# internal element counter
$self->{submit} = 0;
$self->{name} = $name ? $name : "frm";
bless($self, $type);
$self->{action} = $self->{formdata}->{"form_$self->{name}_submit"};
$self->postaction;
return $self;
}
sub postaction {
my ($self) = @_;
my ($key, %d);
# Rebuild Date for IP, Bool and Time fields
foreach $key (sort keys (%{$self->{formdata}})) {
if ($key =~ m/ip_[0-9]+_(.*)/) {
if (!(exists ($d{$1}))) {
$d{$1}=1;
defined ($self->{formdata}->{"ip_0_$1"}) ||
($self->{formdata}->{"ip_0_$1"} = '0');
defined ($self->{formdata}->{"ip_1_$1"}) ||
($self->{formdata}->{"ip_1_$1"} = '0');
defined ($self->{formdata}->{"ip_2_$1"}) ||
($self->{formdata}->{"ip_2_$1"} = '0');
defined ($self->{formdata}->{"ip_3_$1"}) ||
($self->{formdata}->{"ip_3_$1"} = '0');
$self->{formdata}->{"$1"} =
$self->{formdata}->{"ip_0_$1"} . "." .
$self->{formdata}->{"ip_1_$1"} . "." .
$self->{formdata}->{"ip_2_$1"} . "." .
$self->{formdata}->{"ip_3_$1"};
}
}
if ($key =~ m/time_[0-9]+_(.*)/) {
if (!(exists ($d{$1}))) {
$d{$1}=1;
defined ($self->{formdata}->{"time_0_$1"}) ||
($self->{formdata}->{"time_0_$1"} = '00');
defined ($self->{formdata}->{"time_1_$1"}) ||
($self->{formdata}->{"time_1_$1"} = '00');
$self->{formdata}->{"$1"} =
$self->{formdata}->{"time_0_$1"} . ":" .
$self->{formdata}->{"time_1_$1"};
}
}
if ($key =~ m/cb_n_(.*)/) {
if (!(exists ($d{$1}))) {
my $name = $1;
$d{$name} = 1;
my $val = "";
my $tmp;
foreach my $k (keys (%{$self->{formdata}})) {
if ($k =~ m/cb__(\w+)_$name/) {
$tmp->{$1} = 1;
}
}
foreach my $k (keys (%$tmp)) {
$val .= " " if $val;
$val .= $k;
}
$self->{formdata}->{"$1"} = $val;
}
}
if ($key =~ m/bool_n_(.*)/) {
if (!(exists ($d{$1}))) {
$d{$1}=1;
my $val = "0";
if ($self->{formdata}->{"bool_$1"}) {
$val = "1";
}
$self->{formdata}->{"$1"} = $val;
}
}
}
}
sub action {
my ($self) = @_;
return $self->{action};
}
sub create_element {
my ($self, $name, $type, $value, $opt, $width) = @_;
my $out = '';
my $class = 'normal';
my $encvalue = encode_entities ($value);
$width = 200 if !$width;
my $innerwidth = $width - 5; # width - margin - border - padding
my $widthstr = "style='width:${innerwidth}px;'";
# normal text
if ($type eq "text") {
$out .= "";
}
elsif ($type eq "textarea") {
my $rows = $opt || 4;
my $rh = int ($rows*int(1.2*12+1));
$out .= "";
}
elsif ($type eq "viewonly") {
$out .= "";
}
# read only text
elsif ($type eq "rotext") {
$out .= "";
}
# server time
elsif ($type eq "rotime") {
my $uid = PVE::HTMLControls::get_uid('mytimer');
$out .= "
$encvalue
";
$out .= PVE::HTMLControls::create_time_viewer ($uid);
}
# time of day
elsif ($type eq "time") {
my @tmp = split(/:/, $value);
for my $i (0..1) {
$out .= "";
$out .= " : " if !$i;
}
}
# password
elsif ($type eq "password") {
$out .= "";
}
# number
elsif ($type eq "number") {
$out .= "";
}
# float
elsif ($type eq "float") {
$out .= "";
}
# boolean value (0, 1)
elsif ($type eq "bool" || $type eq "robool" || $type eq 'dynamicbool' || $type eq "nbool") {
my $checked = $value ? 'checked' : '';
my $id = "bool_$name";
$out .= "";
if ($type eq "robool") {
$out .= "";
}
$out .= "";
}
# dropdown
elsif ($type eq "dropdown" || $type eq "dynamicdropdown") {
my $table = PVE::HTMLTable->new ([]);
my $titles;
my $values;
my $defvalue;
if (ref($opt) eq 'ARRAY') {
$values = $opt;
} else {
$values = $opt->{values};
$defvalue = $opt->{default};
foreach my $head (@{$opt->{titles}}) {
push @$titles, 1, undef, $head;
}
}
$table->add_headline ($titles) if $titles;
if (defined($value)) {
my $found;
my $first;
foreach my $elem (@$values) {
my ($ev, $et, @da);
if (ref ($elem) eq 'ARRAY') {
($ev, $et, @da) = @$elem;
} else {
$ev = $et = $elem;
}
$first = $ev if !$first;
$found = 1 if $ev eq $value;
}
if (!$found) {
$value = defined ($defvalue) ? $defvalue : $first;
}
}
foreach my $elem (@$values) {
my ($ev, $et, @da);
if (ref ($elem) eq 'ARRAY') {
($ev, $et, @da) = @$elem;
} else {
$ev = $et = $elem;
}
push @da, $et if !scalar (@da);
if (!defined($value)) {
$value = defined ($defvalue) ? $defvalue : $ev;
}
my $checked = ($ev eq $value) ? 'checked="checked"' : '';
my $inp = "";
my @line;
foreach my $dv (@da) {
if ($inp) {
push @line, "$inp$dv";
$inp = undef;
} else {
push @line, $dv;
}
}
$table->add_row ('', @line);
}
my $width1 = $width - 25;
$out .= "";
$out .= "
";
$out .= "
";
$out .= $table->out_table();
$out .= "
";
$out .= "
";
$out .= "";
}
# checkbox
elsif ($type eq "checkbox") {
my ($rows, $elref) = @$opt;
my $sel;
my @element = @$elref;
map { $sel->{$_} = 1; } split ('\s', $value);
$out .= "";
$out .= "";
}
# ip address
elsif ($type eq "ip") {
my @tmp = split(/\./, $value);
$out .= "";
}
# file upload
elsif ($type eq "file") {
# most wrowsers (firefox) ignore setting 'width', dont know how to fix
$out .= "";
}
# hidden input
elsif ($type eq "hidden") {
if (defined ($value)) {
$out .= "";
}
}
# Day of week
elsif ($type eq "dow") {
my $cl = { mon => '', tue => '', wed => '', thu => '',
fri => '', sat => '', sun => '' };
foreach my $day (split (/\s+/, $value)) {
$cl->{$day} = 'checked';
}
my @dn = split (/\s+/, __("Mon Tue Wed Thu Fri Sat Sun"));
my $w='15%';
$out .= "";
}
else {
die "unknown elemet type '$type'";
}
$out .= "\n";
return $out;
}
sub create_cmdbutton {
my ($self, $type, $text) = @_;
my $href = "javascript:pve_form_save(\"$self->{name}\", \"$type\");";
my $out = "
";
$text = $type if !$text;
if ($type eq "save") {
$text = __('save');
} elsif ($type eq "search") {
$text = __('search');
} elsif ($type eq "create") {
$text = __('create');
} elsif ($type eq "upload") {
$text = __('upload');
}
$out .= "$text";
return $out;
}
sub create_header {
my ($self, $action) = @_;
$action = '' if !$action;
return "";
return $out;
}
1;