--- loncom/interface/lonhelper.pm	2007/09/08 23:41:49	1.164
+++ loncom/interface/lonhelper.pm	2008/12/19 20:51:35	1.169
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # .helper XML handler to implement the LON-CAPA helper
 #
-# $Id: lonhelper.pm,v 1.164 2007/09/08 23:41:49 albertel Exp $
+# $Id: lonhelper.pm,v 1.169 2008/12/19 20:51:35 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -624,9 +624,9 @@ HEADER
             $result .= "<a href=\"$returnPage\">" . &mt("End Helper") . "</a>";
         }
         else {
-            $result .= '<nobr><input name="back" type="button" ';
+            $result .= '<span class="LC_nobreak"><input name="back" type="button" ';
             $result .= 'value="' . $previous . '" onclick="history.go(-1)" /> ';
-            $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></nobr>';
+            $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></span>';
         }
     }
 
@@ -643,9 +643,9 @@ HEADER
             $result .= "<a href=\"$returnPage\">" . &mt('End Helper') . "</a>";
         }
         else {
-            $result .= '<nobr><input name="back" type="button" ';
+            $result .= '<span class="LC_nobreak"><input name="back" type="button" ';
             $result .= 'value="' . $previous . '" onclick="history.go(-1)" /> ';
-            $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></nobr>';
+            $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></span>';
         }
     }
 
@@ -1725,7 +1725,7 @@ no strict;
 use strict;
 use Apache::lonlocal; # A localization nightmare
 use Apache::lonnet;
-use Time::localtime;
+use DateTime;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::date',
@@ -1775,14 +1775,13 @@ sub render {
     my $time=time;
     my ($anytime,$onclick);
 
-
     # first check VARS for a valid new value from the user
     # then check DEFAULT_VALUE for a valid default time value
     # otherwise pick now as reasonably good time
 
     if (defined($helper->{VARS}{$var})
 	&&  $helper->{VARS}{$var} > 0) {
-	$date = localtime($helper->{VARS}{$var});
+        $date = &get_date_object($helper->{VARS}{$var}); 
     } elsif (defined($self->{DEFAULT_VALUE})) {
         my $valueFunc = eval($self->{DEFAULT_VALUE});
         die('Error in default value code for variable ' . 
@@ -1790,17 +1789,17 @@ sub render {
         $time = &$valueFunc($helper, $self);
 	if (lc($time) eq 'anytime') {
 	    $anytime=1;
-	    $date = localtime(time);
+	    $date = &get_date_object(time);
 	    $date->min(0);
 	} elsif (defined($time) && $time ne 0) {
-	    $date = localtime($time);
+	    $date = &get_date_object($time);
 	} else {
 	    # leave date undefined so it'll default to now
 	}
     }
 
     if (!defined($date)) {
-	$date = localtime(time);
+	$date = &get_date_object(time);
 	$date->min(0);
     }
 
@@ -1817,12 +1816,12 @@ sub render {
     my $i;
     $result .= "<select $onclick name='${var}month'>\n";
     for ($i = 0; $i < 12; $i++) {
-        if ($i == $date->mon) {
+        if (($i + 1) == $date->mon) {
             $result .= "<option value='$i' selected='selected'>";
         } else {
             $result .= "<option value='$i'>";
         }
-        $result .= &mt($months[$i]) . "</option>\n";
+        $result .= &mt($months[$i])."</option>\n";
     }
     $result .= "</select>\n";
 
@@ -1841,7 +1840,7 @@ sub render {
     # Year
     $result .= "<select $onclick name='${var}year'>\n";
     for ($i = 2000; $i < 2030; $i++) { # update this after 64-bit dates
-        if ($date->year + 1900 == $i) {
+        if ($date->year == $i) {
             $result .= "<option selected='selected'>";
         } else {
             $result .= "<option>";
@@ -1896,6 +1895,7 @@ sub render {
         }
         $result .= "</select>\n";
     }
+    $result  .= ' '.$date->time_zone_short_name().' ';
     if ($self->{'anytime'}) {
 	$result.=(<<CHECK);
 <script type="text/javascript">
@@ -1923,7 +1923,8 @@ sub postprocess {
     if ($env{'form.' . $var . 'anytime'}) {
 	$helper->{VARS}->{$var} = undef;
     } else {
-	my $month = $env{'form.' . $var . 'month'}; 
+	my $month = $env{'form.' . $var . 'month'};
+        $month ++;
 	my $day = $env{'form.' . $var . 'day'}; 
 	my $year = $env{'form.' . $var . 'year'}; 
 	my $min = 0; 
@@ -1933,25 +1934,40 @@ sub postprocess {
 	    $hour = $env{'form.' . $var . 'hour'};
 	}
 
-	my $chosenDate;
-	eval {$chosenDate = Time::Local::timelocal(0, $min, $hour, $day, $month, $year);};
+	my ($chosenDate,$checkDate);
+        my $timezone = &Apache::lonlocal::gettimezone();
+        my $dt;
+	eval {
+               $dt = DateTime->new( year   => $year,
+                                    month  => $month,
+                                    day    => $day,
+                                    hour   => $hour,
+                                    minute => $min,
+                                    second => 0,
+                                    time_zone => $timezone,
+                             );
+        };
+
 	my $error = $@;
+        if (!$error) {
+            $chosenDate  = $dt->epoch;
+            $checkDate = &get_date_object($chosenDate);
+        }
 
 	# Check to make sure that the date was not automatically co-erced into a 
 	# valid date, as we want to flag that as an error
 	# This happens for "Feb. 31", for instance, which is coerced to March 2 or
 	# 3, depending on if it's a leap year
-	my $checkDate = localtime($chosenDate);
 	
 	if ($error || $checkDate->mon != $month || $checkDate->mday != $day ||
-	    $checkDate->year + 1900 != $year) {
+	    $checkDate->year != $year) {
 	    unless (Apache::lonlocal::current_language()== ~/^en/) {
 		$self->{ERROR_MSG} = &mt("Invalid date entry");
 		return 0;
 	    }
 	    # LOCALIZATION FIXME: Needs to be parameterized
-	    $self->{ERROR_MSG} = "Can't use " . $months[$month] . " $day, $year as a "
-		. "date because it doesn't exist. Please enter a valid date.";
+	    $self->{ERROR_MSG} = "Can't use ".$months[$env{'form.'.$var.'month'}].                                 " $day, $year as a ".
+		                 "date because it doesn't exist. Please enter a valid date.";
 
 	    return 0;
 	}
@@ -1974,6 +1990,20 @@ sub postprocess {
 
     return 1;
 }
+
+sub get_date_object {
+    my ($epoch) = @_;
+    my $dt = DateTime->from_epoch(epoch => $epoch)
+                     ->set_time_zone(&Apache::lonlocal::gettimezone());
+    my $lang = Apache::lonlocal::current_language();
+    if ($lang ne '') {
+        eval {
+            $dt->set_locale($lang);
+        };
+    }
+    return $dt;
+}
+
 1;
 
 package Apache::lonhelper::resource;
@@ -2832,17 +2862,17 @@ BUTTONS
 	    &Apache::loncacc::constructaccess($subdir,
 				     $Apache::lonnet::perlvar{'lonDefDomain'});
 	$metadir='/res/'.$domain.'/'.$user.'/'.$2;
-        @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, '');
+        @fileList = &Apache::lonnet::dirlist($subdir,$domain,$user,undef,undef,'/');
     } elsif ($subdir =~ m|^~([^/]+)/(.*)$|) {
 	$subdir='/home/'.$1.'/public_html/'.$2;
 	my ($user,$domain)= 
 	    &Apache::loncacc::constructaccess($subdir,
 				     $Apache::lonnet::perlvar{'lonDefDomain'});
 	$metadir='/res/'.$domain.'/'.$user.'/'.$2;
-        @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, '');
+        @fileList = &Apache::lonnet::dirlist($subdir,$domain,$user,undef,undef,'/');
     } else {
         # local library server resource space
-        @fileList = &Apache::lonnet::dirlist($subdir, $env{'user.domain'}, $env{'user.name'}, '');
+        @fileList = &Apache::lonnet::dirlist($subdir,$env{'user.domain'},$env{'user.name'},undef,undef,'/');
     }
 
     # Sort the fileList into order
@@ -3603,7 +3633,7 @@ sub render {
     
     # Print the granularity, depending on the action
     if ($vars->{GRANULARITY} eq 'whole_course') {
-        $resourceString .= '<li>'.&mt('for <b>all resources in the course</b>').'</li>';
+        $resourceString .= '<li>'.&mt('for [_1]all resources in the course[_2]','<b>','</b>').'</li>';
 	if ($vars->{TARGETS} eq 'course') {
 	    $level = 14; # general course, see lonparmset.pm perldoc
 	} elsif ($vars->{TARGETS} eq 'section') {
@@ -3618,10 +3648,16 @@ sub render {
         $paramlevel = 'general';
     } elsif ($vars->{GRANULARITY} eq 'map') {
         my $navmap = Apache::lonnavmaps::navmap->new();
-        my $res = $navmap->getByMapPc($vars->{RESOURCE_ID});
-        my $title = $res->compTitle();
-        $symb = $res->symb();
-        $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>';
+        if (defined($navmap)) {
+             my $res = $navmap->getByMapPc($vars->{RESOURCE_ID});
+             my $title = $res->compTitle();
+             $symb = $res->symb();
+             $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>';
+        } else {
+            $resourceString .= '<li>'.&mt('for the map ID [_1] (name unavailable)','<b>'.$vars->{RESOURCE_ID}.'</b>').'</li>';
+            &Apache::lonnet::logthis('Retrieval of map title failed in lonhelper.pm - could not create navmap object for course.');
+
+        }
 	if ($vars->{TARGETS} eq 'course') {
 	    $level = 13; # general course, see lonparmset.pm perldoc
 	} elsif ($vars->{TARGETS} eq 'section') {
@@ -3634,13 +3670,18 @@ sub render {
         $affectedResourceId = $vars->{RESOURCE_ID};
         $paramlevel = 'map';
     } else {
-        my $navmap = Apache::lonnavmaps::navmap->new();
-        my $res = $navmap->getById($vars->{RESOURCE_ID});
         my $part = $vars->{RESOURCE_ID_part};
 	if ($part ne 'All Parts' && $part) { $parm_name=~s/^0/$part/; } else { $part=&mt('All Parts'); }
-        $symb = $res->symb();
-        my $title = $res->compTitle();
-        $resourceString .= '<li>'.&mt('for the resource named [_1] part [_2]',"<b>$title</b>","<b>$part</b>").'</li>';
+        my $navmap = Apache::lonnavmaps::navmap->new();
+        if (defined($navmap)) {
+            my $res = $navmap->getById($vars->{RESOURCE_ID});
+            $symb = $res->symb();
+            my $title = $res->compTitle();
+            $resourceString .= '<li>'.&mt('for the resource named [_1] part [_2]',"<b>$title</b>","<b>$part</b>").'</li>';
+        } else {
+            $resourceString .= '<li>'.&mt('for the resource ID [_1] (name unavailable) part [_2]','<b>'.$vars->{RESOURCE_ID}.'</b>',"<b>$part</b>").'</li>';
+            &Apache::lonnet::logthis('Retrieval of resource title failed in lonhelper.pm - could not create navmap object for course.');
+        }
 	if ($vars->{TARGETS} eq 'course') {
 	    $level = 10; # general course, see lonparmset.pm perldoc
 	} elsif ($vars->{TARGETS} eq 'section') {
@@ -3719,7 +3760,7 @@ sub render {
     
     # Print targets
     if ($vars->{TARGETS} eq 'course') {
-        $result .= '<li>'.&mt('for <b>all students in course</b>').'</li>';
+        $result .= '<li>'.&mt('for [_1]all students in course[_2]','<b>','</b>').'</li>';
     } elsif ($vars->{TARGETS} eq 'section') {
         my $section = $vars->{SECTION_NAME};
         $result .= '<li>'.&mt('for section [_1]',"<b>$section</b>").'</li>';
@@ -3744,7 +3785,8 @@ sub render {
 
     # Print value
     if ($vars->{ACTION_TYPE} ne 'tries' && $vars->{ACTION_TYPE} ne 'weight') {
-	$result .= '<li>'.&mt('to [_1] ([_2])',"<b>".ctime($vars->{PARM_DATE})."</b>",Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}))."</li>\n";
+        my $showdate = &Apache::lonlocal::locallocaltime($vars->{PARM_DATE});
+	$result .= '<li>'.&mt('to [_1] ([_2])',"<b>".$showdate."</b>",Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}))."</li>\n";
     }
  
     # print pres_marker