--- loncom/interface/slotrequest.pm	2005/09/13 07:31:08	1.15
+++ loncom/interface/slotrequest.pm	2005/10/17 21:21:39	1.25
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler for requesting to have slots added to a students record
 #
-# $Id: slotrequest.pm,v 1.15 2005/09/13 07:31:08 albertel Exp $
+# $Id: slotrequest.pm,v 1.25 2005/10/17 21:21:39 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -58,7 +58,6 @@ sub start_page {
     $r->print($html.'<head><title>'.
 	      &mt('Request another Worktime').'</title></head>');
     $r->print(&Apache::loncommon::bodytag('Requesting another Worktime'));
-    $r->print('<p>'.$env{'form.command'}.'</p>');
 }
 
 sub end_page {
@@ -453,33 +452,63 @@ STUFF
 }
 
 sub show_table {
-    my ($r,$symb,$mgr)=@_;
+    my ($r,$mgr)=@_;
 
     my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
+    if ( (keys(%slots))[0] =~ /^error: 2 /) {
+	undef(%slots);
+    } 
     my $available;
     if ($mgr eq 'F') {
 	$r->print('<form method="POST" action="/adm/slotrequest">
 <input type="hidden" name="command" value="uploadstart" />
-<input type="hidden" name="symb" value="'.$env{'form.symb'}.'" />
 <input type="submit" name="start" value="'.&mt('Upload Slot List').'" />
 </form>');
     }
+    my $linkstart='<a href="/adm/slotrequest?command=showslots&amp;order=';
     $r->print('<table border="1">
 <tr>
-  <th>Slot name</th>
-  <th>Type</th>
-  <th>Description</th>
-  <th>Start Time</th>
-  <th>End Time</th>
-  <th>Max space</th>
-  <th>Scheduled Students</th>
-  <th>Proctors</th>
-  <th>Unique Period</th>
+  <th></th>
+  <th>'.$linkstart.'name"        >Slot name</a></th>
+  <th>'.$linkstart.'type"        >Type</a></th>
+  <th>'.$linkstart.'description" >Description</a></th>
+  <th>'.$linkstart.'starttime"   >Start Time</a></th>
+  <th>'.$linkstart.'endtime"     >End Time</a></th>
+  <th>'.$linkstart.'startreserve">Time Students Can Start Reserving</a></th>
+  <th>'.$linkstart.'secret"      >Secret</a></th>
+  <th>'.$linkstart.'maxspace"    >Max space</a></th>
+  <th>                            Scheduled Students</th>
+  <th>'.$linkstart.'unique"      >Unique Period</a></th>
 </tr>');
-    foreach my $slot (sort 
-		      { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }
-		      (keys(%slots)))  {
+    my %name_cache;
+    my $slotsort = sub {
+	if ($env{'form.order'}=~/^(type|description|endtime|maxspace)$/) {
+	    if (lc($slots{$a}->{$env{'form.order'}})
+		ne lc($slots{$b}->{$env{'form.order'}})) {
+		return (lc($slots{$a}->{$env{'form.order'}}) 
+			cmp lc($slots{$b}->{$env{'form.order'}}));
+	    }
+	} elsif ($env{'form.order'} eq 'name') {
+	    if (lc($a) cmp lc($b)) {
+		return lc($a) cmp lc($b);
+	    }
+	} elsif ($env{'form.order'} eq 'unique') {
+	    
+	    if ($slots{$a}->{'uniqueperiod'}[0] 
+		ne $slots{$b}->{'uniqueperiod'}[0]) {
+		return ($slots{$a}->{'uniqueperiod'}[0]
+			cmp $slots{$b}->{'uniqueperiod'}[0]);
+	    }
+	    if ($slots{$a}->{'uniqueperiod'}[1] 
+		ne $slots{$b}->{'uniqueperiod'}[1]) {
+		return ($slots{$a}->{'uniqueperiod'}[1]
+			cmp $slots{$b}->{'uniqueperiod'}[1]);
+	    }
+	}
+	return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'};
+    };
+    foreach my $slot (sort $slotsort (keys(%slots)))  {
 	if (defined($slots{$slot}->{'type'})
 	    && $slots{$slot}->{'type'} ne 'schedulable_student') {
 	    #next;
@@ -492,33 +521,62 @@ sub show_table {
 	    my (undef,$id)=split("\0",$entry);
 	    $ids.= $id.'-> '.$consumed{$entry}->{'name'}.'<br />';
 	}
-	my $start=localtime($slots{$slot}->{'starttime'});
-	my $end=localtime($slots{$slot}->{'endtime'});
+	my $start=($slots{$slot}->{'starttime'}?
+		   &Apache::lonlocal::locallocaltime($slots{$slot}->{'starttime'}):'');
+	my $end=($slots{$slot}->{'endtime'}?
+		 &Apache::lonlocal::locallocaltime($slots{$slot}->{'endtime'}):'');
+	my $start_reserve=($slots{$slot}->{'endtime'}?
+			   &Apache::lonlocal::locallocaltime($slots{$slot}->{'startreserve'}):'');
+	
 	my $unique;
 	if (ref($slots{$slot}{'uniqueperiod'})) {
 	    $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).','.
 		localtime($slots{$slot}{'uniqueperiod'}[1]);
 	}
-
+	my @proctors = map {
+	    my ($uname,$udom)=split(/@/,$_);
+	    my $fullname=$name_cache{$_};
+	    if (!defined($fullname)) {
+		&Apache::lonnet::logthis("Gettign $uname $udom");
+		$fullname = &Apache::loncommon::plainname($uname,$udom);
+		$fullname =~s/\s/&nbsp;/g;
+		$name_cache{$_} = $fullname;
+	    }
+	    &Apache::loncommon::aboutmewrapper($fullname,$uname,$udom);
+	} (split(/\s*,\s*/,$slots{$slot}->{'proctor'}));
+	
+	my $proctors=join(', ',@proctors);
+
+	my $edit=(<<EDITFORM);
+<form method="POST" action="/adm/helper/newslot.helper">
+  <input type="hidden" name="name" value="$slot" />
+  <input type="submit" name="Edit" value="Edit" />
+</form>
+EDITFORM
 	$r->print(<<STUFF);
 <tr>
+ <td rowspan="2">$edit</td>
  <td>$slot</td>
  <td>$slots{$slot}->{'type'}</td>
  <td>$description</td>
  <td>$start</td>
  <td>$end</td>
+ <td>$start_reserve</td>
+ <td>$slots{$slot}->{'secret'}</td>
  <td>$slots{$slot}->{'maxspace'}</td>
  <td>$ids</td>
- <td>$slots{$slot}->{'proctor'}</td>
  <td>$unique</td>
 </tr>
+<tr>
+ <td colspan="10">$proctors</td>
+</tr>
 STUFF
     }
     $r->print('</table>');
 }
 
 sub upload_start {
-    my ($r,$symb)=@_;    
+    my ($r)=@_;    
     $r->print(&Apache::grades::checkforfile_js());
     my $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";
     $result.='&nbsp;<b>'.
@@ -529,7 +587,6 @@ sub upload_start {
     my $ignore=&mt('Ignore First Line');
     $result.=<<ENDUPFORM;
 <form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">
-<input type="hidden" name="symb" value="$symb" />
 <input type="hidden" name="command" value="csvuploadmap" />
 $upfile_select
 <br /><input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Data" />
@@ -542,7 +599,7 @@ ENDUPFORM
 }
 
 sub csvuploadmap_header {
-    my ($r,$symb,$datatoken,$distotal)= @_;
+    my ($r,$datatoken,$distotal)= @_;
     my $javascript;
     if ($env{'form.upfile_associate'} eq 'reverse') {
 	$javascript=&csvupload_javascript_reverse_associate();
@@ -566,7 +623,6 @@ to this page if the data selected is ins
 <input type="hidden" name="upfiletype" value="$env{'form.upfiletype'}" />
 <input type="hidden" name="upfile_associate" 
                                        value="$env{'form.upfile_associate'}" />
-<input type="hidden" name="symb"       value="$symb" />
 <input type="hidden" name="command"    value="csvuploadassign" />
 <hr />
 <script type="text/javascript" language="Javascript">
@@ -641,7 +697,7 @@ ENDPICK
 }
 
 sub csv_upload_map {
-    my ($r,$symb)= @_;
+    my ($r)= @_;
 
     my $datatoken;
     if (!$env{'form.datatoken'}) {
@@ -652,7 +708,7 @@ sub csv_upload_map {
     }
     my @records=&Apache::loncommon::upfile_record_sep();
     if ($env{'form.noFirstLine'}) { shift(@records); }
-    &csvuploadmap_header($r,$symb,$datatoken,$#records+1);
+    &csvuploadmap_header($r,$datatoken,$#records+1);
     my ($i,$keyfields);
     if (@records) {
 	my @fields=&csvupload_fields();
@@ -692,7 +748,7 @@ sub csvupload_fields {
 }
 
 sub csv_upload_assign {
-    my ($r,$symb)= @_;
+    my ($r,$mgr)= @_;
     &Apache::loncommon::load_tmp_file($r);
     my @slotdata = &Apache::loncommon::upfile_record_sep();
     if ($env{'form.noFirstLine'}) { shift(@slotdata); }
@@ -715,7 +771,11 @@ sub csv_upload_assign {
 	    $slot{'starttime'}=&UnixDate($entries{$fields{'starttime'}},"%s");
 	}
 	if ($entries{$fields{'endtime'}}) {
-	    $slot{'endtime'}=&UnixDate($entries{$fields{'starttime'}},"%s");
+	    $slot{'endtime'}=&UnixDate($entries{$fields{'endtime'}},"%s");
+	}
+	if ($entries{$fields{'startreserve'}}) {
+	    $slot{'startreserve'}=
+		&UnixDate($entries{$fields{'startreserve'}},"%s");
 	}
 	foreach my $key ('ip','proctor','description','maxspace',
 			 'secret','symb') {
@@ -737,7 +797,7 @@ sub csv_upload_assign {
     }
     $r->print("<br />Created $countdone slots\n");
     $r->print("<br />\n");
-    &show_table($r,$symb);
+    &show_table($r,$mgr);
     return '';
 }
 
@@ -746,33 +806,35 @@ sub handler {
 
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
     &start_page($r);
-    my $symb=&Apache::lonnet::unescape($env{'form.symb'});
-    my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);
-    if ($res !~ /\.task$/) {
-	&fail($r,'not_valid');
-	return OK;
-    }
-    $env{'request.symb'}=$symb;
     my $vgr=&Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     my $mgr=&Apache::lonnet::allowed('mgr',$env{'request.course.id'});
     if ($env{'form.command'} eq 'showslots' && $vgr eq 'F') {
-	&show_table($r,$symb,$mgr);
+	&show_table($r,$mgr);
     } elsif ($env{'form.command'} eq 'uploadstart' && $mgr eq 'F') {
-	&upload_start($r,$symb);
+	&upload_start($r);
     } elsif ($env{'form.command'} eq 'csvuploadmap' && $mgr eq 'F') {
-	&csv_upload_map($r,$symb);
+	&csv_upload_map($r);
     } elsif ($env{'form.command'} eq 'csvuploadassign' && $mgr eq 'F') {
 	if ($env{'form.associate'} ne 'Reverse Association') {
-	    &csv_upload_assign($r,$symb);
+	    &csv_upload_assign($r,$mgr);
 	} else {
 	    if ( $env{'form.upfile_associate'} ne 'reverse' ) {
 		$env{'form.upfile_associate'} = 'reverse';
 	    } else {
 		$env{'form.upfile_associate'} = 'forward';
 	    }
-	    &csv_upload_map($r,$symb);
+	    &csv_upload_map($r);
 	}
+    } elsif ($env{'form.command'} eq 'editslot' && $mgr eq 'F') {
+	&show_slot_edit($r);
     } else {
+	my $symb=&Apache::lonnet::unescape($env{'form.symb'});
+	my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);
+	if ($res !~ /\.task$/) {
+	    &fail($r,'not_valid');
+	    return OK;
+	}
+	$env{'request.symb'}=$symb;
 	my ($status) = &Apache::lonhomework::check_task_access('0');
 	if ($status eq 'CAN_ANSWER' ||
 	    $status eq 'NEEDS_CHECKIN' ||