--- loncom/interface/lonmsgdisplay.pm	2006/04/25 23:12:34	1.16
+++ loncom/interface/lonmsgdisplay.pm	2006/05/17 09:51:26	1.26
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines for messaging display
 #
-# $Id: lonmsgdisplay.pm,v 1.16 2006/04/25 23:12:34 albertel Exp $
+# $Id: lonmsgdisplay.pm,v 1.26 2006/05/17 09:51:26 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -28,6 +28,7 @@
 
 
 package Apache::lonmsgdisplay;
+use     Apache::lonselstudent;
 
 =pod
 
@@ -259,89 +260,21 @@ sub movemsg {
 # ======================================================= Display a course list
 
 sub discourse {
-    my $r=shift;
-    my $classlist = &Apache::loncoursedata::get_classlist();
-    my $now=time;
-    my %lt=&Apache::lonlocal::texthash('cfa' => 'Check All',
-            'cfs' => 'Check Section/Group',
-            'cfn' => 'Uncheck All');
-    $r->print(<<ENDDISHEADER);
-<input type="hidden" name="sendmode" value="group" />
-<script>
-    function checkall() {
-	for (i=0; i<document.forms.compemail.elements.length; i++) {
-            if 
-          (document.forms.compemail.elements[i].name.indexOf('send_to_')==0) {
-	      document.forms.compemail.elements[i].checked=true;
-            }
-        }
-    }
-
-    function checksec() {
-	for (i=0; i<document.forms.compemail.elements.length; i++) {
-            if 
-          (document.forms.compemail.elements[i].name.indexOf
-           ('send_to_&&&'+document.forms.compemail.chksec.value+'&&&')==0) {
-	      document.forms.compemail.elements[i].checked=true;
-            }
-        }
-    }
+    my $result;
+    my ($course_personnel,
+	$current_members,
+	$expired_members,
+	$future_members) = &Apache::lonselstudent::get_people_in_class();
+    unshift @$current_members, (@$course_personnel);
+    my %defaultUsers;
+
+    $result = &Apache::lonselstudent::render_student_list($current_members,
+							  "compemail",
+							  "current",
+							  \%defaultUsers,
+							  1,"selectedusers",1);
 
-    function uncheckall() {
-	for (i=0; i<document.forms.compemail.elements.length; i++) {
-            if 
-          (document.forms.compemail.elements[i].name.indexOf('send_to_')==0) {
-	      document.forms.compemail.elements[i].checked=false;
-            }
-        }
-    }
-</script>
-<input type="button" onClick="checkall()" value="$lt{'cfa'}" />&nbsp;
-<input type="button" onClick="checksec()" value="$lt{'cfs'}" />
-<input type="text" size="5" name="chksec" />&nbsp;
-<input type="button" onClick="uncheckall()" value="$lt{'cfn'}" />
-<p>
-ENDDISHEADER
-    my %coursepersonnel=&Apache::lonnet::get_course_adv_roles();
-    $r->print('<table>');
-    foreach my $role (sort keys %coursepersonnel) {
-        foreach (split(/\,/,$coursepersonnel{$role})) {
-            my ($puname,$pudom)=split(/\:/,$_);
-            $r->print('<tr><td><label>'.
-                      '<input type="checkbox" name="send_to_&&&&&&_'.
-                      $puname.':'.$pudom.'" /> '.
-                      &Apache::loncommon::plainname($puname,$pudom).
-                      '</label></td>'.
-                      '<td>('.$_.'),</td><td><i>'.$role.'</i></td></tr>');
-        }
-    }
-    $r->print('</table><table>');
-    my $sort = sub {
-	my $aname=lc($classlist->{$a}[&Apache::loncoursedata::CL_FULLNAME()]);
-	if (!$aname) { $aname=$a; }
-	my $bname=lc($classlist->{$b}[&Apache::loncoursedata::CL_FULLNAME()]);
-	if (!$bname) { $bname=$b; }
-	return $aname cmp $bname;
-    };
-    foreach my $student (sort $sort (keys(%{$classlist}))) {
-	my $info=$classlist->{$student};
-        my ($sname,$sdom,$status,$fullname,$section) =
-            (@{$info}[&Apache::loncoursedata::CL_SNAME(),
-                      &Apache::loncoursedata::CL_SDOM(),
-                      &Apache::loncoursedata::CL_STATUS(),
-                      &Apache::loncoursedata::CL_FULLNAME(),
-                      &Apache::loncoursedata::CL_SECTION()]);
-        next if ($status ne 'Active');
-	next if ($env{'request.course.sec'} &&
-		 $section ne $env{'request.course.sec'});
-        my $key = 'send_to_&&&'.$section.'&&&_'.$student;
-        if (! defined($fullname) || $fullname eq '') { $fullname = $sname; }
-        $r->print('<tr><td><label>'.
-                  qq{<input type="checkbox" name="$key" />}.('&nbsp;'x2).
-                  $fullname.'</label></td><td>'.$sname.':'.$sdom.'</td><td>'.$section.
-                  '</td></tr>');
-    }
-    $r->print('</table>');
+    return $result;
 }
 
 # ==================================================== Display Critical Message
@@ -857,7 +790,9 @@ sub compout {
     }
     my $citation=&displayresource(%content);
     if ($env{'form.recdom'}) { $defdom=$env{'form.recdom'}; }
-      $r->print(
+    if ($env{'form.text'}) { $dismsg=$env{'form.text'}; }
+    if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; }
+    $r->print(
                 '<form action="/adm/email"  name="compemail" method="post"'.
                 ' enctype="multipart/form-data">'."\n".
                 '<input type="hidden" name="sendmail" value="on" />'."\n".
@@ -932,6 +867,8 @@ ENDUPLOAD
     }
     if ($broadcast eq 'group') {
        &discourse($r);
+       my $studentsel = &discourse();
+       $r->print($studentsel);
     }
     $r->print('</form>'.
 	      &Apache::lonfeedback::generate_preview_button('compemail','message').
@@ -1291,8 +1228,8 @@ sub display_blocker_status {
         'modi' => 'Modify',
         'canc' => 'Cancel',
     );
+    $r->print(&Apache::loncommon::start_data_table());
     $r->print(<<"END");
-<table class="LC_data_table">
   <tr>
     <th>$$ltext{'dura'}</th>
     <th>$$ltext{'setb'}</th>
@@ -1300,26 +1237,27 @@ sub display_blocker_status {
     <th>$$ltext{'actn'}?</th>
   </tr>
 END
-    foreach (sort keys %{$records}) {
-        my $iter = $parmcount%2;
+    foreach my $record (sort(keys(%{$records}))) {
         my $onchange = 'onFocus="javascript:window.document.forms['.
                        "'blockform'].elements['modify_".$parmcount."'].".
                        'checked=true;"';
-        my ($start,$end) = split/____/,$_;
+        my ($start,$end) = split(/____/,$record);
         my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);
         my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);
 	
-	my ($setuname,$setudom,$title) = &parse_block_record($$records{$_});
+	my ($setuname,$setudom,$title) = 
+	    &parse_block_record($$records{$record});
+	$title = &HTML::Entities::encode($title,'"<>&');
         my $settername = &Apache::loncommon::plainname($setuname,$setudom);
+        $r->print(&Apache::loncommon::start_data_table_row());
         $r->print(<<"END");
-       <tr>
         <td>$$ltext{'star'}:&nbsp;$startform<br/>$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>
         <td>$settername</td>
-        <td><input type="text" name="title_$parmcount" size="15" value="$title" /><input type="hidden" name="key_$parmcount" value="$_" /></td>
+        <td><input type="text" name="title_$parmcount" size="15" value="$title" /><input type="hidden" name="key_$parmcount" value="$record" /></td>
         <td><label>$lt{'modi'}?&nbsp;<input type="checkbox" name="modify_$parmcount" /></label><br /><label>$lt{'canc'}?&nbsp;&nbsp;<input type="checkbox" name="cancel_$parmcount" /></label>
-       </tr>
 END
-        $parmcount ++;
+        $r->print(&Apache::loncommon::end_data_table_row());
+        $parmcount++;
     }
     $r->print(<<"END");
 </table>
@@ -1358,19 +1296,23 @@ sub display_addblocker_table {
     );
     $r->print(<<"END");
 <h4>$lt{'addn'}</h4> 
- <table class="LC_data_table">
+END
+    $r->print(&Apache::loncommon::start_data_table());
+    $r->print(<<"END");
    <tr>
      <th>$$ltext{'dura'}</th>
      <th>$$ltext{'even'} $lt{'exam'}</th>
      <th>$$ltext{'actn'}?</th>
    </tr>
-   <tr>
+END
+   $r->print(&Apache::loncommon::start_data_table_row());
+    $r->print(<<"END");
      <td>$$ltext{'star'}:&nbsp;$startform<br />$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>
      <td><input type="text" name="title_$parmcount" size="15" value="" /></td>
      <td><label>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1" /></label></td>
-   </tr>
-  </table>
 END
+    $r->print(&Apache::loncommon::end_data_table_row());
+    $r->print(&Apache::loncommon::end_data_table());
     return;
 }
 
@@ -1388,12 +1330,9 @@ sub blockcheck {
     # for students.
     return if (!%live_courses);
 
-    &Apache::lonnet::logthis("hmm");
-    &Apache::lonnet::logthis(join(" ",%live_courses));
-    &Apache::lonnet::logthis(join(" ",%staff_of));
-
     foreach my $course (keys(%live_courses)) {
-	my ($cdom,$cnum) = split(/_/,$course);
+	my $cdom = $env{'course.'.$course.'.domain'};
+	my $cnum = $env{'course.'.$course.'.num'};
 
 	# if they are a staff member and are currently not playing student
 	next if ( $staff_of{$course} 
@@ -1428,31 +1367,35 @@ sub build_block_table {
         'cour' => 'Course',
         'dura' => 'Duration',
         'blse' => 'Block set by'
-    ); 
+    );
+    $r->print(<<"END");
+<br /><br />$lt{'cacb'}:<br /><br />
+END
+    $r->print(&Apache::loncommon::start_data_table());
     $r->print(<<"END");
-<br /<br />$lt{'cacb'}:<br /><br />
-<table class="LC_data_table">
 <tr>
  <th>$lt{'cour'}</th>
  <th>$lt{'dura'}</th>
  <th>$lt{'blse'}</th>
 </tr>
 END
-    foreach (keys %{$setters}) {
-        my %courseinfo=&Apache::lonnet::coursedescription($_);
-        for (my $i=0; $i<@{$$setters{$_}{staff}}; $i++) {
-            my ($uname,$udom) = @{$$setters{$_}{staff}[$i]};
+    foreach my $course (keys(%{$setters})) {
+        my %courseinfo=&Apache::lonnet::coursedescription($course);
+        for (my $i=0; $i<@{$$setters{$course}{staff}}; $i++) {
+            my ($uname,$udom) = @{$$setters{$course}{staff}[$i]};
             my $fullname = &Apache::loncommon::plainname($uname,$udom);
-            my ($openblock,$closeblock) = @{$$setters{$_}{times}[$i]};
+            my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]};
             $openblock = &Apache::lonlocal::locallocaltime($openblock);
             $closeblock= &Apache::lonlocal::locallocaltime($closeblock);
-            $r->print('<tr><td>'.$courseinfo{'description'}.'</td>'.
+            $r->print(&Apache::loncommon::start_data_table_row().
+		      '<td>'.$courseinfo{'description'}.'</td>'.
                       '<td>'.$openblock.' to '.$closeblock.'</td>'.
                       '<td>'.$fullname.' ('.$uname.':'.$udom.
-                      ')</td></tr>');
+                      ')</td>'.
+		       &Apache::loncommon::end_data_table_row());
         }
     }
-    $r->print('</table>');
+    $r->print(&Apache::loncommon::end_data_table());
 }
 
 # ----------------------------------------------------------- Display a message
@@ -1604,7 +1547,7 @@ sub header {
     $r->print(&Apache::loncommon::start_page('Communication and Messages',
 					     $extra));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs
-	      (undef,($title?$title:'Communication and Messages')));
+	      (($title?$title:'Communication and Messages')));
 
 }
 
@@ -1681,13 +1624,26 @@ sub sendoffmail {
 	    &statuschange($msgid,'replied',$folder);
 	}
 
+	my $to = $env{'form.selectedusers.forminput'};
+	my $mode = $env{'form.sendmode'};
+
 	my %toaddr;
-	if ($env{'form.sendmode'} eq 'group') {
-	    foreach my $address (keys(%env)) {
-		if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
-		    $toaddr{$1}='';
+	if ($to) {
+	    foreach my $dest (@$to) {
+		my ($user,$domain) = split /:/, $dest;
+		if (($user ne '') && ($domain ne '')) {
+		    my $address = $user.":".$domain; # How the code below expects it.
+		    $toaddr{$address} = '';
 		}
 	    }
+	}
+
+	if ($env{'form.sendmode'} eq 'group') {
+	     foreach my $address (keys(%env)) {
+	 	if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
+	 	    $toaddr{$1}='';
+	 	}
+	    }
 	} elsif ($env{'form.sendmode'} eq 'upload') {
 	    foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {
 		my ($rec,$txt)=split(/\s*\:\s*/,$line);
@@ -1697,12 +1653,16 @@ sub sendoffmail {
 		}
 	    }
 	} else {
-	    $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+	    if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
+		$toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+	    }
 	}
 	if ($env{'form.additionalrec'}) {
 	    foreach (split(/\,/,$env{'form.additionalrec'})) {
 		my ($auname,$audom)=split(/\@/,$_);
-		$toaddr{$auname.':'.$audom}='';
+		if (($auname ne "") && ($audom ne "")) {
+		    $toaddr{$auname.':'.$audom}='';
+		}
 	    }
 	}
 
@@ -1831,7 +1791,7 @@ sub sendoffmail {
 	}
     } else {
 	$r->print('<p><span class="LC_error">'.&mt('Could not deliver message').'</span> '.
-		  &mt('Please use the browser "Back" button and correct the recipient addresses').'</p>');
+		  &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'</p>');
     }
 }
 
@@ -1852,7 +1812,7 @@ sub handler {
         ['display','replyto','forward','markread','markdel','markunread',
          'sendreply','compose','sendmail','critical','recname','recdom',
          'recordftf','sortedby','block','folder','startdis','interdis',
-	 'showcommentbaseurl','dismode']);
+	 'showcommentbaseurl','dismode','group','subject','text']);
     $sqs='&sortedby='.$env{'form.sortedby'};
 
 # ------------------------------------------------------ They checked for email