<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package Webmin::Time;
use Webmin::Input;
use Time::Local;
use WebminCore;
@ISA = ( "Webmin::Input" );

=head2 new Webmin::Time(name, time, [disabled])
Create a new field for selecting a time
=cut
sub new
{
if (defined(&amp;Webmin::Theme::Time::new)) {
        return new Webmin::Theme::Time(@_[1..$#_]);
        }
my ($self, $name, $value, $disabled) = @_;
bless($self = { });
$self-&gt;set_name($name);
$self-&gt;set_value($value);
$self-&gt;set_disabled($disabled) if (defined($disabled));
return $self;
}

=head2 html()
Returns the HTML for the time chooser
=cut
sub html
{
my ($self) = @_;
my $rv;
my $val = $self-&gt;get_value();
my $hour = ($val/3600) % 24;
my $min = ($val/60) % 60;
my $sec = ($val/1) % 60;
my $name = $self-&gt;get_name();
$rv .= &amp;ui_textbox("hour_".$name, pad2($hour), 2,$self-&gt;get_disabled()).":".
       &amp;ui_textbox("min_".$name, pad2($min), 2, $self-&gt;get_disabled()).":".
       &amp;ui_textbox("sec_".$name, pad2($sec), 2, $self-&gt;get_disabled());
return $rv;
}

sub pad2
{
return $_[0] &lt; 10 ? "0".$_[0] : $_[0];
}

sub set_value
{
my ($self, $value) = @_;
$self-&gt;{'value'} = timegm(localtime($value));
}

=head2 get_value()
Returns the date as a Unix time number (for 1st jan 1970)
=cut
sub get_value
{
my ($self) = @_;
my $in = $self-&gt;{'form'} ? $self-&gt;{'form'}-&gt;{'in'} : undef;
if ($in &amp;&amp; defined($in-&gt;{"hour_".$self-&gt;{'name'}})) {
	my $rv = $self-&gt;to_time($in);
	return defined($rv) ? $rv : $self-&gt;{'value'};
	}
elsif ($in &amp;&amp; defined($in-&gt;{"ui_value_".$self-&gt;{'name'}})) {
	return $in-&gt;{"ui_value_".$self-&gt;{'name'}};
	}
else {
	return $self-&gt;{'value'};
	}
}

sub to_time
{
my ($self, $in) = @_;
my $hour = $in-&gt;{"hour_".$self-&gt;{'name'}};
return undef if ($hour !~ /^\d+$/ || $hour &lt; 0 || $hour &gt; 23);
my $min = $in-&gt;{"min_".$self-&gt;{'name'}};
return undef if ($min !~ /^\d+$/ || $min &lt; 0 || $min &gt; 59);
my $sec = $in-&gt;{"sec_".$self-&gt;{'name'}};
return undef if ($sec !~ /^\d+$/ || $sec &lt; 0 || $sec &gt; 59);
return $hour*60*60 + $min*60 + $sec;
}

sub set_validation_func
{
my ($self, $func) = @_;
$self-&gt;{'validation_func'} = $func;
}

=head2 validate()
Ensures that the date is valid
=cut
sub validate
{
my ($self) = @_;
my $tm = $self-&gt;to_time($self-&gt;{'form'}-&gt;{'in'});
if (!defined($tm)) {
	return ( $text{'ui_etime'} );
	}
if ($self-&gt;{'validation_func'}) {
	my $err = &amp;{$self-&gt;{'validation_func'}}($self-&gt;get_value(),
					        $self-&gt;{'name'},
						$self-&gt;{'form'});
	return ( $err ) if ($err);
	}
return ( );
}

=head2 set_auto(auto?)
If set to 1, the time will be automatically incremented by Javascript
=cut
sub set_auto
{
my ($self, $auto) = @_;
$self-&gt;{'auto'} = $auto;
if ($auto) {
	# XXX incorrect!!
	my $formno = $self-&gt;{'form'}-&gt;get_formno();
	$self-&gt;{'form'}-&gt;add_onload("F=[0]; timeInit(F); setTimeout(\"timeUpdate(F)\", 5000)");
	my $as = $autoscript;
	$as =~ s/NAME/$self-&gt;{'name'}/g;
	$self-&gt;{'form'}-&gt;add_script($as);
	}
}

$autoscript = &lt;&lt;EOF;
function timeInit(F) {
        secs = new Array();
        mins = new Array();
        hours = new Array();
        for(i=0; i&lt;F.length; i++){
                secs[i]  = document.forms[F[i]].sec_NAME;
                mins[i]  = document.forms[F[i]].min_NAME;
                hours[i] = document.forms[F[i]].hour_NAME;
		}
}
function timeUpdate(F) {
        for(i=0; i&lt;F.length; i++){
                s = parseInt(secs[i].value);
                s = s ? s : 0;
                s = s+5;
                if( s&gt;59 ){
                        s -= 60;
                        m = parseInt(mins[i].value);
                        m= m ? m : 0;
                        m+=1;
                        if( m&gt;59 ){
                                m -= 60;
                                h = parseInt(hours[i].value);
                                h = h ? h : 0;
                                h+=1;
                                if( h&gt;23 ){
                                        h -= 24;
                                }
                                hours[i].value  = packNum(h);
                        }
                        mins[i].value  = packNum(m);
                }
        secs[i].value = packNum(s);
	}
        setTimeout('timeUpdate(F)', 5000);
}
function packNum(t) {
        return (t &lt; 10 ? '0'+t : t);
}
EOF

1;

</pre></body></html>