Handle hostnames with upper-case letters
[webmin.git] / Webmin / Time.pm
1 package Webmin::Time;
2 use Webmin::Input;
3 use Time::Local;
4 use WebminCore;
5 @ISA = ( "Webmin::Input" );
6
7 =head2 new Webmin::Time(name, time, [disabled])
8 Create a new field for selecting a time
9 =cut
10 sub new
11 {
12 if (defined(&Webmin::Theme::Time::new)) {
13         return new Webmin::Theme::Time(@_[1..$#_]);
14         }
15 my ($self, $name, $value, $disabled) = @_;
16 bless($self = { });
17 $self->set_name($name);
18 $self->set_value($value);
19 $self->set_disabled($disabled) if (defined($disabled));
20 return $self;
21 }
22
23 =head2 html()
24 Returns the HTML for the time chooser
25 =cut
26 sub html
27 {
28 my ($self) = @_;
29 my $rv;
30 my $val = $self->get_value();
31 my $hour = ($val/3600) % 24;
32 my $min = ($val/60) % 60;
33 my $sec = ($val/1) % 60;
34 my $name = $self->get_name();
35 $rv .= &ui_textbox("hour_".$name, pad2($hour), 2,$self->get_disabled()).":".
36        &ui_textbox("min_".$name, pad2($min), 2, $self->get_disabled()).":".
37        &ui_textbox("sec_".$name, pad2($sec), 2, $self->get_disabled());
38 return $rv;
39 }
40
41 sub pad2
42 {
43 return $_[0] < 10 ? "0".$_[0] : $_[0];
44 }
45
46 sub set_value
47 {
48 my ($self, $value) = @_;
49 $self->{'value'} = timegm(localtime($value));
50 }
51
52 =head2 get_value()
53 Returns the date as a Unix time number (for 1st jan 1970)
54 =cut
55 sub get_value
56 {
57 my ($self) = @_;
58 my $in = $self->{'form'} ? $self->{'form'}->{'in'} : undef;
59 if ($in && defined($in->{"hour_".$self->{'name'}})) {
60         my $rv = $self->to_time($in);
61         return defined($rv) ? $rv : $self->{'value'};
62         }
63 elsif ($in && defined($in->{"ui_value_".$self->{'name'}})) {
64         return $in->{"ui_value_".$self->{'name'}};
65         }
66 else {
67         return $self->{'value'};
68         }
69 }
70
71 sub to_time
72 {
73 my ($self, $in) = @_;
74 my $hour = $in->{"hour_".$self->{'name'}};
75 return undef if ($hour !~ /^\d+$/ || $hour < 0 || $hour > 23);
76 my $min = $in->{"min_".$self->{'name'}};
77 return undef if ($min !~ /^\d+$/ || $min < 0 || $min > 59);
78 my $sec = $in->{"sec_".$self->{'name'}};
79 return undef if ($sec !~ /^\d+$/ || $sec < 0 || $sec > 59);
80 return $hour*60*60 + $min*60 + $sec;
81 }
82
83 sub set_validation_func
84 {
85 my ($self, $func) = @_;
86 $self->{'validation_func'} = $func;
87 }
88
89 =head2 validate()
90 Ensures that the date is valid
91 =cut
92 sub validate
93 {
94 my ($self) = @_;
95 my $tm = $self->to_time($self->{'form'}->{'in'});
96 if (!defined($tm)) {
97         return ( $text{'ui_etime'} );
98         }
99 if ($self->{'validation_func'}) {
100         my $err = &{$self->{'validation_func'}}($self->get_value(),
101                                                 $self->{'name'},
102                                                 $self->{'form'});
103         return ( $err ) if ($err);
104         }
105 return ( );
106 }
107
108 =head2 set_auto(auto?)
109 If set to 1, the time will be automatically incremented by Javascript
110 =cut
111 sub set_auto
112 {
113 my ($self, $auto) = @_;
114 $self->{'auto'} = $auto;
115 if ($auto) {
116         # XXX incorrect!!
117         my $formno = $self->{'form'}->get_formno();
118         $self->{'form'}->add_onload("F=[0]; timeInit(F); setTimeout(\"timeUpdate(F)\", 5000)");
119         my $as = $autoscript;
120         $as =~ s/NAME/$self->{'name'}/g;
121         $self->{'form'}->add_script($as);
122         }
123 }
124
125 $autoscript = <<EOF;
126 function timeInit(F) {
127         secs = new Array();
128         mins = new Array();
129         hours = new Array();
130         for(i=0; i<F.length; i++){
131                 secs[i]  = document.forms[F[i]].sec_NAME;
132                 mins[i]  = document.forms[F[i]].min_NAME;
133                 hours[i] = document.forms[F[i]].hour_NAME;
134                 }
135 }
136 function timeUpdate(F) {
137         for(i=0; i<F.length; i++){
138                 s = parseInt(secs[i].value);
139                 s = s ? s : 0;
140                 s = s+5;
141                 if( s>59 ){
142                         s -= 60;
143                         m = parseInt(mins[i].value);
144                         m= m ? m : 0;
145                         m+=1;
146                         if( m>59 ){
147                                 m -= 60;
148                                 h = parseInt(hours[i].value);
149                                 h = h ? h : 0;
150                                 h+=1;
151                                 if( h>23 ){
152                                         h -= 24;
153                                 }
154                                 hours[i].value  = packNum(h);
155                         }
156                         mins[i].value  = packNum(m);
157                 }
158         secs[i].value = packNum(s);
159         }
160         setTimeout('timeUpdate(F)', 5000);
161 }
162 function packNum(t) {
163         return (t < 10 ? '0'+t : t);
164 }
165 EOF
166
167 1;
168