--- loncom/interface/Attic/londropadd.pm	2005/04/07 06:56:23	1.127
+++ loncom/interface/Attic/londropadd.pm	2006/04/26 14:52:22	1.140
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to drop and add students in courses 
 #
-# $Id: londropadd.pm,v 1.127 2005/04/07 06:56:23 albertel Exp $
+# $Id: londropadd.pm,v 1.140 2006/04/26 14:52:22 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -43,15 +43,9 @@ use Apache::lonlocal;
 ###############################################################
 ###############################################################
 sub header {
-    my $html=&Apache::lonxml::xmlbegin();
-    my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager');
-    my $title = &mt('LON-CAPA Enrollment Manager');
+    my $start_page=&Apache::loncommon::start_page('Enrollment Manager');
     return(<<ENDHEAD);
-$html
-<head>
-<title>$title</title>
-</head>
-$bodytag
+$start_page
 <form method="post" enctype="multipart/form-data"  
       action="/adm/dropadd" name="studentform">
 ENDHEAD
@@ -137,7 +131,8 @@ sub domain_form {
 ###############################################################
 #  Menu Phase One
 sub print_main_menu {
-    my ($r,$enrl_permission,$view_permission)=@_;
+    my ($r,$enrl_permission,$view_permission,$grp_manage_permission,
+        $grp_view_permission)=@_;
     #
     my ($cdom,$cnum) = split/_/,$env{'request.course.id'};
     my @menu = 
@@ -171,6 +166,26 @@ sub print_main_menu {
             permission => &Apache::lonnet::auto_run($cnum,$cdom),
             url  => '/adm/populate',
             },
+          { text => 'Create a new group',
+            help => 'Course_Create_Group',
+            permission => $grp_manage_permission,
+            url => '/adm/coursegroups?refpage=enrl&action=create',
+            },
+          { text => 'Modify an existing group',
+            help => 'Course_Modify_Group',
+            permission => $grp_manage_permission,
+            url => '/adm/coursegroups?refpage=enrl&action=modify',
+            },
+          { text => 'Delete an existing group',
+            help => 'Course_Delete_Group',
+            permission => $grp_manage_permission,
+            url => '/adm/coursegroups?refpage=enrl&action=delete',
+            },
+          { text => 'Enter an existing group',
+            help => 'Course_Display_Group',
+            permission => $grp_view_permission,
+            url => '/adm/coursegroups?refpage=enrl&action=view',
+            },
           );
     my $menu_html = '';
     foreach my $menu_item (@menu) {
@@ -253,8 +268,8 @@ sub print_upload_manager_header {
     $r->print('<input type="button" value="Reverse Association" '.
               'name="'.&mt('Reverse Association').'" '.
               'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');
-    $r->print('<input type="checkbox" name="noFirstLine" $checked />'.
-              &mt('Ignore First Line'));
+    $r->print('<label><input type="checkbox" name="noFirstLine" $checked />'.
+              &mt('Ignore First Line').'</label>');
     $r->print("<hr />\n".
               '<script type="text/javascript" language="Javascript">'."\n".
               $javascript."\n".$javascript_validations.'</script>');
@@ -607,6 +622,7 @@ sub print_upload_manager_footer {
     $Str .= '<h3>'.&mt('Login Type')."</h3>\n";
     $Str .= "<p>\n".
         &mt('Note: this will not take effect if the user already exists').
+	&Apache::loncommon::help_open_topic('Auth_Options').
         "</p><p>\n";
     $Str .= $krbform."\n</p><p>\n".
         $intform."\n</p><p>\n".
@@ -616,14 +632,14 @@ sub print_upload_manager_footer {
     $Str .= "<h3>".&mt('Starting and Ending Dates')."</h3>\n";
     $Str .= "<p>\n".$date_table."</p>\n";
     $Str .= "<h3>".&mt('Full Update')."</h3>\n";
-    $Str .= '<input type="checkbox" name="fullup" value="yes">'.
+    $Str .= '<label><input type="checkbox" name="fullup" value="yes">'.
         ' '.&mt('Full update (also print list of users not enrolled anymore)').
-        "</p>\n";
+        "</label></p>\n";
     $Str .= "<h3>".&mt('Student Number')."</h3>\n";
-    $Str .= "<p>\n".'<input type="checkbox" name="forceid" value="yes">';
+    $Str .= "<p>\n".'<label><input type="checkbox" name="forceid" value="yes">';
     $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '.
                 'of Conflicting IDs (only do if you know what you are doing)').
-                "\n</p><p>\n";
+                "</label>\n</p><p>\n";
     $Str .= '<input type="button" onClick="javascript:verify(this.form)" '.
         'value="Update Class List" />'."<br />\n";
     $Str .= &mt('Note: for large courses, this operation may be time '.
@@ -852,16 +868,16 @@ sub date_setting_table {
     my ($starttime,$endtime,$mode) = @_;
     my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode);
     my $dateDefault = '<nobr>'.
-        '<input type="checkbox" name="makedatesdefault" /> '.
-        &mt('make these dates the default for future enrollment');
+        '<label><input type="checkbox" name="makedatesdefault" /> '.
+        &mt('make these dates the default for future enrollment').'</label>';
     if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
         $dateDefault = '&nbsp;';
     }
-    my $perpetual = '<nobr><input type="checkbox" name="no_end_date"';
+    my $perpetual = '<nobr><label><input type="checkbox" name="no_end_date"';
     if (defined($endtime) && $endtime == 0) {
         $perpetual .= ' checked';
     }
-    $perpetual.= ' /> '.&mt('no ending date').'</nobr>';
+    $perpetual.= ' /> '.&mt('no ending date').'</label></nobr>';
     if ($mode eq 'create_enrolldates') {
         $perpetual = '&nbsp;';
     }
@@ -889,7 +905,8 @@ sub make_dates_default {
         $result .= "Set default start and end dates for course<br />";
         #
         # Refresh the course environment
-        &Apache::lonnet::coursedescription($env{'request.course.id'});
+        &Apache::lonnet::coursedescription($env{'request.course.id'},
+					   {'freshen_cache' => 1});
     } else {
         $result .= &mt('Unable to set default dates for course').":".$put_result.
             '<br />';
@@ -986,6 +1003,7 @@ sub print_enroll_single_student_form {
 		       'psam' => "Please select an authentication mechanism",
                        'mail' => "Email Address"
 					   );
+	my $authhelp=&Apache::loncommon::help_open_topic('Auth_Options');
         $user_data_html = <<END;
 <h3>$lt{'udf'} $username\@$domain</h3>
 <table>
@@ -1003,7 +1021,7 @@ sub print_enroll_single_student_form {
     <td><input type="text" name="emailaddress" size="20" /></td></tr>
 </table>
 <h3>$lt{'pswd'}</h3>
-$lt{'psam'}
+$lt{'psam'}$authhelp
 <table>
 <p>
 $krbform
@@ -1115,8 +1133,10 @@ $date_table
 <p>
 $lt{'idsn'}: <input type="text" name="cstid" size="10">
 </p><p>
+<label>
 <input type="checkbox" name="forceid" value="yes"> 
 $lt{'disn'}
+</label>
 </p><p>
 <input type="button" onClick="verify(this.form)" value="$lt{'eas'}">
 </p>
@@ -1162,10 +1182,11 @@ sub print_html_classlist {
         $env{'form.output'} = 'html';
     }
     #
-    $r->print('<br /><table border="2">');
+    $r->print('<br />'.&Apache::loncommon::start_data_table());
     foreach my $role (sort keys %coursepersonnel) {
         next if ($role =~ /^\s*$/);
-	$r->print('<tr><td>'.$role.'</td><td>');
+	$r->print(&Apache::loncommon::start_data_table_row().
+		  '<td>'.$role.'</td><td>');
         foreach my $user (split(',',$coursepersonnel{$role})) {
 	    my ($puname,$pudom)=split(':',$user);
 	    $r->print(' '.&Apache::loncommon::aboutmewrapper(
@@ -1173,9 +1194,9 @@ sub print_html_classlist {
                                                                   $pudom),
                                                              $puname,$pudom));
 	}
-        $r->print('</td></tr>');
+        $r->print('</td>'.&Apache::loncommon::end_data_table_row());
     }
-    $r->print('</table>');
+    $r->print(&Apache::loncommon::end_data_table());
     #
     # Interface output
     $r->print('<input type="hidden" name="action" value="'.
@@ -1233,6 +1254,11 @@ sub show_class_list {
     if ($sortby !~ /^(username|domain|section|fullname|id|start|end|type)$/) {
         $sortby = 'username';
     }
+    if (! exists($env{'form.displayphotos'})) {
+        $env{'form.displayphotos'} = 'off';
+    }
+    my $displayphotos = $env{'form.displayphotos'};
+
     # Print out header 
     unless ($mode eq 'autoenroll') {
         $r->print(<<END);
@@ -1241,6 +1267,7 @@ END
     }
     $r->print(<<END);
 <input type="hidden" name="sortby" value="$sortby" />
+<input type="hidden" name="displayphotos" value="$displayphotos" />
 END
     if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
         if ($linkto eq 'aboutme') {
@@ -1255,7 +1282,8 @@ END
                                            'sec'    => "section",
                                            'start'  => "start date",
                                            'end'    => "end date",
-                                           'type'   => "enroll type/action"
+                                           'type'   => "enroll type/action",
+                                           'photo'  => "photo",
 					   );
         unless ($mode eq 'autoenroll') {
             $r->print(<<END);
@@ -1263,9 +1291,22 @@ END
 <input type="hidden" name="sdom"   value="" />
 END
         }
+        if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
+            $r->print('
+<script type="text/javascript">
+function photowindow(photolink) {
+    var title = "Photo_Viewer";
+    var options = "scrollbars=1,resizable=1,menubar=0";
+    options += ",width=240,height=240";
+    stdeditbrowser = open(photolink,title,options,"1");
+    stdeditbrowser.focus();
+}
+</script>
+           ');
+        }
         $r->print("
 <p>
-<table border=2>
+".&Apache::loncommon::start_data_table()."
 <tr>
         ");
         if ($mode eq 'autoenroll') {
@@ -1293,8 +1334,23 @@ END
     </th><th>
        <a href="javascript:document.studentform.sortby.value='end';document.studentform.submit();">$lt{'end'}</a>
     </th>
-  </tr>
 END
+        if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
+            my %photo_options = &Apache::lonlocal::texthash(
+                                                            'on' => 'Show',
+                                                            'off' => 'Hide',
+                                                            );
+            my $photochg = 'on';
+            if ($displayphotos eq 'on') {
+                $photochg = 'off';
+            }
+            $r->print('    <th>'."\n".'     '. 
+            '<a href="javascript:document.studentform.displayphotos.value='.
+                      "'".$photochg."'".';document.studentform.submit();">'.
+                      $photo_options{$photochg}.'</a>&nbsp;'.$lt{'photo'}."\n".
+                      '    </th>'."\n");
+        }
+        $r->print("  </tr>\n");
     } elsif ($mode eq 'csv') {
 	#
 	# Open a file
@@ -1385,22 +1441,22 @@ END
             } else {
                 $end = &Apache::lonlocal::locallocaltime($end);
             }
-            $r->print("<tr>\n    ");
+	    $r->print(&Apache::loncommon::start_data_table_row());
             if ($mode eq 'autoenroll') {
                 my $lockedtype = $sdata->[$index{'lockedtype'}];
                 $studentcount++;
                 my $cellentry;
                 if ($type eq 'auto') {
-                    $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<input type="checkbox" name="chgauto" value="'.$username.':'.$domain.'" />&nbsp;Change';
+                    $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$username.':'.$domain.'" />&nbsp;Change</label>';
                     $autocount ++;
                 } else {
-                    $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><nobr><input type="checkbox" name="chgmanual" value="'.$username.':'.$domain.'" />&nbsp;Change</nobr></td></tr><tr><td><nobr>';
+                    $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><nobr><label><input type="checkbox" name="chgmanual" value="'.$username.':'.$domain.'" />&nbsp;Change</label></nobr></td></tr><tr><td><nobr>';
                     $manualcount ++;
                     if ($lockedtype) {
-                        $cellentry .= '<input type="checkbox" name="unlockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Unlock');
+                        $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Unlock').'</label>';
                         $unlockcount ++;
                     } else {
-                        $cellentry .= '<input type="checkbox" name="lockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Lock');
+                        $cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Lock').'</label>';
                         $lockcount ++;
                     }
                     $cellentry .= '</nobr></td></tr></table>';
@@ -1432,8 +1488,21 @@ END
     <td>$section</td>
     <td>$start</td>
     <td>$end</td>
-   </tr>
 END
+            if ($env{'course.'.$env{'request.course.id'}.
+			 '.internal.showphoto'}) {
+                if ($displayphotos eq 'on') {
+                    my $imgurl = 
+			&Apache::lonnet::retrievestudentphoto($domain,
+							      $username,'gif',
+							      'thumbnail');
+                
+                    $r->print('    <td align="right"><a href="javascript:photowindow('."'".&Apache::lonnet::studentphoto($domain,$username,'jpg')."'".')"><img src="'.$imgurl.'" border="1"></a></td>');
+                } else {
+                    $r->print('    <td>&nbsp;</td>  ');
+                }
+            }
+	    $r->print(&Apache::loncommon::end_data_table_row());
         } elsif ($mode eq 'csv') {
             next if (! defined($CSVfile));
             # no need to bother with $linkto
@@ -1460,16 +1529,20 @@ END
                                           $name,$section]);
             my $col = 5;
             foreach my $time ($start,$end) {
-                $excel_sheet->write($row,$col++,
+                if (defined($time) && $time != 0) {
+                    $excel_sheet->write($row,$col++,
                                    &Apache::lonstathelpers::calc_serial($time),
                                     $format->{'date'});
+                } else {
+                    $excel_sheet->write($row,$col++,'none');
+                }                    
             }
             $excel_sheet->write($row,$col++,$status);
             $row++;
         }
     }
     if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
-        $r->print('</table><br>');
+	$r->print(&Apache::loncommon::end_data_table().'<br />');
     } elsif ($mode eq 'excel') {
         $excel_workbook->close();
         $r->print('<p><a href="'.$excel_filename.'">'.
@@ -1509,7 +1582,7 @@ sub print_modify_student_form {
                   '<p>'.
                   &mt('Unable to retrieve environment data for').' '.$sname.
                   &mt('in domain').' '.$sdom.'</p><p>'.
-                  &mt('Please contact your LON-CAPA administrator regarding this situation.').'</p></body></html>');
+                  &mt('Please contact your LON-CAPA administrator regarding this situation.').'</p>'.&Apache::loncommon::end_page());
         return;
     }
     # determine the students starting and ending times and section
@@ -1588,16 +1661,18 @@ $info{'lastname'} $info{'generation'}, $
 </p><p>
 <b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12"/>
 </p><p>
+<label>
 <input type="checkbox" name="forceid" > 
 $lt{'disn'}
+</label>
 </p><p>
 <b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14"/>
 </p>
 <p>$current_date_description</p>
 <p>$date_table</p>
 <input type="submit" value="$lt{'sm'}" />
-</body></html>
 END
+    $r->print(&Apache::loncommon::end_page());
     return;
 }
 
@@ -1605,7 +1680,7 @@ END
 # modify a single students section 
 #
 sub modify_single_student {
-    my $r = shift;
+    my ($r) = @_;
     #
     # Remove non alphanumeric values from the section
     $env{'form.section'} =~ s/\W//g;
@@ -1747,8 +1822,8 @@ END
 <input type="hidden" name="sortby" value="$sortby" />
 <input type="hidden" name="Status" value="$status" />
 <a href="javascript:document.studentform.submit();">$Masd</a>
-</body></html>
 END
+    $r->print(&Apache::loncommon::end_page());
     return;
 }
 
@@ -1851,8 +1926,8 @@ my %lt=&Apache::lonlocal::texthash('usrn
                                    'end'    => "end date",
                                    );
     if ($nosort) {
+	$r->print(&Apache::loncommon::start_data_table());
         $r->print(<<END);
-<table border=2>
 <tr>
     <th>&nbsp;</th>
     <th>$lt{'usrn'}</th>
@@ -1866,8 +1941,8 @@ my %lt=&Apache::lonlocal::texthash('usrn
 END
 
     } else  {
+	$r->print(&Apache::loncommon::start_data_table());
         $r->print(<<END);
-<table border=2>
 <tr><th>&nbsp;</th>
     <th>
        <a href="/adm/dropadd?action=$action&sortby=username">$lt{'usrn'}</a>
@@ -1927,8 +2002,8 @@ END
         my $status   = $sdata->[$index{'status'}];
         next if ($status ne 'Active');
         #
+        $r->print(&Apache::loncommon::start_data_table_row());
         $r->print(<<"END");
-<tr>
     <td><input type="checkbox" name="droplist" value="$student"></td>
     <td>$username</td>
     <td>$domain</td>
@@ -1937,10 +2012,10 @@ END
     <td>$section</td>
     <td>$start</td>
     <td>$end</td>
-</tr>
 END
+        $r->print(&Apache::loncommon::end_data_table_row());
     }
-    $r->print('</table><br>');
+    $r->print(&Apache::loncommon::end_data_table().'<br />');
     %lt=&Apache::lonlocal::texthash(
 	               'dp'   => "Drop Students",
                        'ca'   => "check all",
@@ -1969,15 +2044,15 @@ sub print_first_courselist_upload_form {
     $str .= "<p>\n";
     $str .= '<input type="submit" name="fileupload" value="'.
         &mt('Upload class list').'">'."\n";
-    $str .= '<input type="checkbox" name="noFirstLine" /> '.
-        &mt('Ignore First Line')."</p>\n";
+    $str .= '<label><input type="checkbox" name="noFirstLine" /> '.
+        &mt('Ignore First Line')."</label></p>\n";
     $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
                          &mt("How do I create a class list from a spreadsheet")).
                              "<br />\n";
     $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
                            &mt("How do I create a CSV file from a spreadsheet")).
                                "<br />\n";
-    $str .= "</body>\n</html>\n";
+    $str .= &Apache::loncommon::end_page();
     $r->print($str);
     return;
 }
@@ -2033,7 +2108,7 @@ sub upfile_drop_add {
         if (! exists($home_servers{$desiredhost})) {
             $r->print('<font color="#ff0000">'.&mt('Error').'</font>'.
                       &mt('Invalid home server specified'));
-            $r->print("</body>\n</html>\n");
+            $r->print(&Apache::loncommon::end_page());
             return;
         }
     }
@@ -2208,12 +2283,7 @@ sub upfile_drop_add {
 sub drop_student_list {
     my $r=shift;
     my $count=0;
-    my @droplist;
-    if (ref($env{'form.droplist'})) {
-        @droplist = @{$env{'form.droplist'}};
-    } else {
-        @droplist = ($env{'form.droplist'});
-    }
+    my @droplist = &Apache::loncommon::get_env_multiple('form.droplist');
     foreach (@droplist) {
         my ($uname,$udom)=split(/\:/,$_);
         # drop student
@@ -2284,7 +2354,8 @@ sub handler {
     if (! ($env{'request.course.fn'})) {
         # Not in a course
         $env{'user.error.msg'}=
-            "/adm/dropadd:cst:0:0:Cannot drop or add students";
+            "/adm/dropadd:cst:0:0:Cannot manage or view course groups, ".
+                                  "or drop or add students";
         return HTTP_NOT_ACCEPTABLE; 
     }
     #
@@ -2292,11 +2363,21 @@ sub handler {
         &Apache::lonnet::allowed('vcl',$env{'request.course.id'});
     my $enrl_permission = 
         &Apache::lonnet::allowed('cst',$env{'request.course.id'});
-    if (! $view_permission && ! $enrl_permission) {
+
+    my $grp_view_permission =
+        &Apache::lonnet::allowed('vcg',$env{'request.course.id'});
+    my $grp_manage_permission =
+        &Apache::lonnet::allowed('mdg',$env{'request.course.id'});
+
+
+    if (! $grp_view_permission && ! $grp_manage_permission && 
+                                  ! $view_permission && ! $enrl_permission) {
         $env{'user.error.msg'}=
-            "/adm/dropadd:cst:0:0:Cannot drop or add students";
-        return HTTP_NOT_ACCEPTABLE;        
+     "/adm/coursegroups:cst:0:0:Cannot manage or view course groups, ".
+                                 "or drop or add students";
+        return HTTP_NOT_ACCEPTABLE;
     }
+
     #
     # Only output the header information if they did not request csv format
     #
@@ -2309,7 +2390,8 @@ sub handler {
     if (! exists($env{'form.action'})) {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   (undef,'Enrollment Manager'));
-        &print_main_menu($r,$enrl_permission,$view_permission);
+        &print_main_menu($r,$enrl_permission,$view_permission,$grp_manage_permission,
+                         $grp_view_permission);
     } elsif ($env{'form.action'} eq 'upload' && $enrl_permission) {
         &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/dropadd?action=upload&state=',
@@ -2398,7 +2480,7 @@ sub handler {
     }
     #
     # Finish up
-    $r->print('</form></body></html>');
+    $r->print('</form>'.&Apache::loncommon::end_page());
     return OK;
 }