--- loncom/interface/lonnotify.pm	2005/10/14 19:10:20	1.6
+++ loncom/interface/lonnotify.pm	2005/12/09 00:08:35	1.9
@@ -53,35 +53,50 @@ sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['command']);
     my $command = $env{'form.command'};
+    my $origin = $env{'form.origin'};
+
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     my %ltext=&Apache::lonlocal::texthash(
                'note' => 'Notification E-mail',
     );
     my $function = &Apache::loncommon::get_users_function();
+    my $loadcode;
     my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg');
-    my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users');
+    if ((defined($env{'form.origin'})) && ($command eq 'compose' || $command eq 'pick_target' || $command eq 'pick_display')) {
+        unless ($env{'form.origin'} eq '') {
+            $loadcode = 'javascript:setFormElements(document.'.$env{'form.command'}.')';
+            if (($command eq 'pick_target') && (
+                     ($origin eq 'compose') || ($origin eq 'process'))) {
+                if ($env{'form.coursepick'} eq 'category') {
+                    $loadcode .= ';javascript:setCourseCat(document.'.$env{'form.command'}.')';
+                }
+            }
+        }
+    }
+    my $loaditems = ' onLoad="'.$loadcode.'" '; 
+    my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users',$function,$loaditems);
     my $html=&Apache::lonxml::xmlbegin();
     &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>'/adm/notify',
           text=>"Broadcast E-mail"});
     if ($command eq 'process') {
-        &print_request_receipt($r,$cdom,$tablecolor,$bodytag,$html,\%ltext);
+        &print_request_receipt($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext);
     } elsif ($command eq 'compose') {
-        &print_composition_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext);
+        &print_composition_form($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext);
     } elsif ($command eq 'pick_target') {
-        &print_selection_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext);
+        &print_selection_form($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext);
     } elsif ($command eq 'pick_display') {
-        &print_display_option_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext);
+        &print_display_option_form($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext);
     } elsif ($command eq 'display') {
-        &print_display($r,$cdom,$tablecolor,$bodytag,$html,\%ltext);
+        &print_display($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext);
     } else {
-        &print_front_page($r,$cdom,$tablecolor,$bodytag,$html,\%ltext);
+        &print_front_page($r,'front',$cdom,$tablecolor,$bodytag,$html,\%ltext);
     }
     return OK;
 }
 
 sub print_front_page {
-    my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
+    my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs
             (undef,'Broadcast e-mail to Domain','Broadcast_system_email');
     my $jscript = qq|
@@ -110,7 +125,7 @@ $bodytag
 $breadcrumbs
 <br />
 ENDONE
-    $output .= '<form name="front" method="post">'.
+    $output .= '<form name="'.$formname.'" method="post">'.
               '<input type="hidden" name="command" />';
     $output .= &Apache::lonhtmlcommon::start_pick_box();
     $output .= '<table cellspacing="8" cellpadding="8">'.
@@ -129,14 +144,13 @@ ENDONE
 }
 
 sub print_display_option_form {
-    my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
+    my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
     &Apache::lonhtmlcommon::add_breadcrumb
          ({text=>"Display options"});
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs
             (undef,'Broadcast e-mail display options','Broadcast_system_email');
     my $table_width = '';
     my $col_width = '200';
-    my $formname = 'display_options';
     my $cmd = 'display';
     my $submit_text = 'Display e-mail';
     my @roles = ('dc');
@@ -150,7 +164,22 @@ sub print_display_option_form {
     my $enddateform = &Apache::lonhtmlcommon::date_setter($formname,
                                                           'enddate',
                                                           $now);
-    my $jscript;
+    my %elements = (
+        startdate_month => 'selectbox',
+        startdate_hour => 'selectbox',
+        enddate_month => 'selectbox',
+        enddate_hour => 'selectbox',
+        startdate_day => 'text',
+        startdate_year => 'text',
+        startdate_minute => 'text',
+        startdate_second => 'text',
+        enddate_day => 'text',
+        enddate_year => 'text',
+        enddate_minute => 'text',
+        enddate_second => 'text',
+        sender => 'checkbox',
+    );
+    my $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements);
     my $output = <<"ENDONE";
 $html
 <head>
@@ -199,9 +228,9 @@ ENDONE
 }
 
 sub print_display {
-    my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
+    my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
     &Apache::lonhtmlcommon::add_breadcrumb
-         ({href=>'/adm/notify?command=pick_display',
+         ({href=>"javascript:goBack('pick_display')",
           text=>"Display options"},
          {text=>"E-mail display"});
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs
@@ -212,7 +241,6 @@ sub print_display {
     my $rowColor2 = "#eeeeee";
     my $rowColor;
     my $msgcount = 0;
-    my $formname = 'display_sent';
     my $start = &Apache::lonhtmlcommon::get_date_from_form('startdate');
     my $end = &Apache::lonhtmlcommon::get_date_from_form('enddate');
     my @senders = &Apache::loncommon::get_env_multiple('form.sender');
@@ -221,9 +249,15 @@ sub print_display {
     my %Sortby = ();
     my $jscript = <<"ENDSCRIPT";
 function changeSort(caller) {
+    document.$formname.command.value = '$formname';
     document.$formname.sortby.value = caller;
-    document.$formname.submit();   
+    document.$formname.submit();
 }
+function goBack(target) {
+    document.$formname.command.value = target;
+    document.$formname.submit();
+}
+
 ENDSCRIPT
     my $output = <<"ENDONE";
 $html
@@ -239,25 +273,17 @@ $breadcrumbs
 <form method="post" name="$formname">
 ENDONE
 
-    foreach my $server (keys(%sentmail)) {
-        foreach my $msgid (keys(%{$sentmail{$server}})) {
-            my %content = &unpackagemail($sentmail{$server}{$msgid});
-            if (defined($dcmail{$msgid})) {
-                foreach my $user (keys(%{$content{'recipients'}})) {
+    foreach my $msgid (keys(%sentmail)) {
+        my %content = &unpackagemail($sentmail{$msgid});
+        $msgcount ++;
+        %{$dcmail{$msgid}} = ();
+        foreach my $item (keys(%content)) {
+            if ($item eq 'recipients') {
+                foreach my $user (keys(%{$content{recipients}})) {
                     $dcmail{$msgid}{recipients}{$user} = $content{recipients}{$user};
                 }
             } else {
-                $msgcount ++;
-                %{$dcmail{$msgid}} = ();
-                foreach my $item (keys(%content)) {
-                    if ($item eq 'recipients') {
-                        foreach my $user (keys(%{$content{recipients}})) {
-                            $dcmail{$msgid}{recipients}{$user} = $content{recipients}{$user};
-                        }
-                    } else {
-                        $dcmail{$msgid}{$item} = $content{$item};
-                    }
-                }
+                $dcmail{$msgid}{$item} = $content{$item};
             }
         }
     }
@@ -338,10 +364,16 @@ ENDONE
         $output .= '<tr bgcolor="#ffffff"><td>&nbsp;</td><td><br><center><i><b><small>&nbsp;&nbsp;No mail sent matching supplied criteria&nbsp;&nbsp;</small><br><br></b></i></td><td>&nbsp;</td></tr>';
     }
     $output .= &Apache::lonhtmlcommon::end_pick_box();
-    $output .= &echo_form_input();
-    unless (defined($env{'form.sortby'})) {
-        $output .= qq(<input type="hidden" name="sortby" value="date" />\n);
-    } 
+    $output .= &Apache::lonhtmlcommon::echo_form_input(['sortby','command','origin']);
+    my $curr_sortby;
+    if (defined($env{'form.sortby'})) {
+        $curr_sortby = $env{'form.sortby'};
+    } else {
+        $curr_sortby = 'date';
+    }
+    $output .= qq(<input type="hidden" name="origin" value="$formname" />\n);
+    $output .= qq(<input type="hidden" name="command" />\n);
+    $output .= qq(<input type="hidden" name="sortby" value="$curr_sortby" />\n);
     $output .= qq(
 </form>
 </body>
@@ -351,7 +383,7 @@ ENDONE
 }
 
 sub print_selection_form {
-    my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
+    my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
     my %coursecodes = ();
     my %codes = ();
     my @codetitles = ();
@@ -364,7 +396,6 @@ sub print_selection_form {
     my $totcodes = 0;
     my $format_reply;
     my $jscript = '';
-    my $formname = 'rolefilter';
     my $table_width = '100%';
     my $col_width = '200';
     my %lt=&Apache::lonlocal::texthash(
@@ -374,11 +405,6 @@ sub print_selection_form {
                'infs' => 'Internal, Filesystem and Local authentication: enter single default.',
                'comp' => 'Compose Message'
            );
-    my $loaditems = qq|
-function initialize_codes() {
-    return;
-}
-    |;
     &Apache::lonhtmlcommon::add_breadcrumb
           ({text=>"Select Audience"});
 
@@ -389,13 +415,60 @@ function initialize_codes() {
             my $numtypes = @codetitles;
             &Apache::lonsupportreq::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);
             &Apache::lonsupportreq::javascript_code_selections($formname,$numtypes,\%cat_titles,\$jscript,\%idlist,\%idnums,\%idlist_titles,\@codetitles);
-            $loaditems = '';
         }
     }
 
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs
             (undef,'Choose e-mail audience','Broadcast_system_email');
     my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($cdom);
+
+    my %elements = (
+                     roles => 'selectbox',
+                     types => 'selectbox',
+                     Year => 'selectbox',
+                     coursepick => 'radio',
+                     coursetotal => 'text',
+                     courselist => 'text',
+                     internal => 'text',
+                     krb4 => 'text',
+                     krb5 => 'text',
+                     local => 'text',
+                     unix => 'text',
+                   );
+    $jscript .= &Apache::lonhtmlcommon::set_form_elements(\%elements);
+    if ($env{'form.coursepick'} eq 'category') {
+        $jscript .= qq|
+function setCourseCat(formname) {
+    if (formname.Year.options[formname.Year.selectedIndex].value == -1) {
+        return;
+    }
+    courseSet('Year');
+    for (var j=0; j<formname.Semester.length; j++) {
+        if (formname.Semester.options[j].value == "$env{'form.Semester'}") {
+            formname.Semester.options[j].selected = true;
+        }
+    }
+    if (formname.Semester.options[formname.Semester.selectedIndex].value == -1) {
+        return;
+    }
+    courseSet('Semester');
+    for (var j=0; j<formname.Department.length; j++) {
+        if (formname.Department.options[j].value == "$env{'form.Department'}") {
+            formname.Department.options[j].selected = true;
+        }
+    }
+    if (formname.Department.options[formname.Department.selectedIndex].value == -1) {
+        return;
+    }
+    courseSet('Department');
+    for (var j=0; j<formname.Number.length; j++) {
+        if (formname.Number.options[j].value == "$env{'form.Number'}") {
+            formname.Number.options[j].selected = true;
+        }
+    }
+}
+|; 
+    }
     my $output = <<"ENDONE";
 $html
 <head>
@@ -411,7 +484,7 @@ $breadcrumbs
 <form method="post" name="$formname">
 ENDONE
    $output .= &Apache::lonhtmlcommon::start_pick_box($table_width);
-   my @roles = ('ow','cc','in','ta','ep','ad','st','cr');
+   my @roles = ('ow','cc','in','ta','ep','st','cr');
    my %longtypes = ();
    my %authtypes = ();
    &form_elements(\%longtypes,\%authtypes);
@@ -437,12 +510,18 @@ ENDONE
 }
 
 sub print_composition_form {
-    my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
+    my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_;
     &Apache::lonhtmlcommon::add_breadcrumb
-        ({href=>'/adm/notify?command=pick_target',
+        ({href=>"javascript:goBack('pick_target')",
           text=>"Select Audience"},
          {text=>"Compose Message"});
     my $jscript = &Apache::loncommon::check_uncheck_jscript();
+    $jscript .= qq|
+function goBack(target) {
+    document.$formname.command.value = target;
+    document.$formname.submit();
+}
+|;
     my $breadcrumbs = (&Apache::lonhtmlcommon::breadcrumbs
         (undef,'Broadcast e-mail to users','Broadcast_system_email'));
 
@@ -451,11 +530,19 @@ sub print_composition_form {
                       'nore' => 'No recipients identified',
                       'emad' => 'e-mail address',
                    );
+    my %elements = (
+                     subject => 'text',
+                     message => 'text',
+                     sender => 'text',
+                     recipient => 'checkbox',
+                   );
+    $jscript .= &Apache::lonhtmlcommon::set_form_elements(\%elements);
+
     $r->print(<<ENDONE);
 $html
 <head>
  <title>LON-CAPA $lt{'note'}</title>
-<script type"text/javascript">
+<script type="text/javascript">
 $jscript
 </script>
 </head>
@@ -529,6 +616,7 @@ ENDONE
     my %recipients = ();
     my %users = ();
     my %access = ();
+    my @sections = ();
     my $totalrecip = 0;
     my @unmatched = ();
     foreach my $role (@roles) {
@@ -539,7 +627,7 @@ ENDONE
     }
     foreach my $course_id (keys(%courses)) {
         my ($cdom,$cnum) = split(/_/,$course_id);
-        &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\%users);
+        &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\@sections,\%users);
     }
     foreach my $role (keys(%users)) {
         foreach my $user (keys(%{$users{$role}})) {
@@ -553,7 +641,7 @@ ENDONE
             }
         }
     }
-    my $output  = '<form name="compose" method="post">'."\n";
+    my $output  = '<form name="'.$formname.'" method="post">'."\n";
   
     if ($totalrecip > 0) {
         $output .= &Apache::lonhtmlcommon::start_pick_box($table_width);
@@ -576,7 +664,7 @@ ENDONE
         foreach my $username (sort(keys(%recipients))) {
             if ($recipients{$username} =~ /\@/) {
                 my $value=&Apache::lonnet::escape($username).':'.&Apache::lonnet::escape($recipients{$username});
-                $output .= '<tr><td><input type="checkbox" name="recipient" value="'.$value.'" checked="checked" /></td><td>'.$username.'</td><td>&nbsp;&nbsp;</td><td>'.$recipients{$username}.'</td></tr>';
+                $output .= '<tr><td><input type="checkbox" name="recipient" value="'.$value.'" /></td><td>'.$username.'</td><td>&nbsp;&nbsp;</td><td>'.$recipients{$username}.'</td></tr>';
             }
         }
         $output .= '</table>';
@@ -595,9 +683,11 @@ ENDONE
         $output .= &Apache::lonhtmlcommon::submit_row($col_width,$tablecolor,&mt('Submit'),'process',&mt('Send Message'));
         $output .= &Apache::lonhtmlcommon::end_pick_box();
     } else {
-        $output .= $lt{'nore'};
+        $output .= $lt{'nore'}."\n".
+                   '<input type="hidden" name="command" value="" />'."\n";
     }
-    $output .= &echo_form_input('command');
+    $output .= '<input type="hidden" name="origin" value="'.$formname.'" />'."\n";
+    $output .= &Apache::lonhtmlcommon::echo_form_input(['command','origin','subject','message','recipient','sender'],);
     $output .= '</form></body></html>';
     $r->print($output);
     return;
@@ -605,25 +695,25 @@ ENDONE
 
 
 sub print_request_receipt {
-    my ($r,$dom,$tablecolor,$bodytag,$html,$ltext) =@_;
+    my ($r,$formname,$dom,$tablecolor,$bodytag,$html,$ltext) =@_;
     my @recipients = &Apache::loncommon::get_env_multiple('form.recipient');
     my $subject = $env{'form.subject'};
     my $message = $env{'form.message'};
     my $from = $env{'form.sender'};
     my $jscript = <<ENDSCRIPT;
-function showCompose() {
-    document.goback.command.value = 'compose';
-    document.goback.submit();
+function goBack(target) {
+    document.$formname.command.value = target;
+    document.$formname.submit();
 }
 ENDSCRIPT
     &Apache::lonhtmlcommon::add_breadcrumb
-        ({href=>'/adm/notify?command=pick_target',
+        ({href=>"javascript:goBack('pick_target')",
           text=>"Select audience"});
     &Apache::lonhtmlcommon::add_breadcrumb
-        ({href=>'javascript:showCompose()',
+        ({href=>"javascript:goBack('compose')",
           text=>"Compose Message"});
     &Apache::lonhtmlcommon::add_breadcrumb
-        ({href=>'/adm/notify?command=process',
+        ({href=>"/adm/notify?command=process",
           text=>"Outcome"});
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs
             (undef,'E-mail Delivery','Broadcast_system_email');
@@ -631,14 +721,14 @@ ENDSCRIPT
 $html
 <head>
  <title>LON-CAPA Notification E-mail</title>
-<script type"text/javascript">
+<script type="text/javascript">
 $jscript
 </script>
 </head>
 $bodytag
 $breadcrumbs
 <br />
-<form name="goback" method="post">
+<form name="$formname" method="post">
 ENDONE
     $output .= &Apache::lonhtmlcommon::start_pick_box();
     my @deliveries = ();
@@ -674,7 +764,9 @@ ENDONE
     }
     $output .= &Apache::lonhtmlcommon::end_pick_box();
     $output .= '<br /><a href="/adm/notify">Send another message?</a>'."\n";
-    $output .= &echo_form_input();
+    $output .= '<input type="hidden" name="command" />'."\n".
+               '<input type="hidden" name="origin" value="'.$formname.'" />'."\n";
+    $output .= &Apache::lonhtmlcommon::echo_form_input(['command','origin']);
     $output .= '
 </form>
 </body>
@@ -685,7 +777,7 @@ ENDONE
 
 sub broadcast_email {
     my ($recipients,$subject,$from,$message,$deliveries,$ltext)=@_;
-# find some way to spread out delivery for large numbers of recipients.
+# Should implement staggered delivery for large numbers of recipients?.
     foreach my $user (@{$recipients}) {
         my $msg = new Mail::Send;
         my ($username,$to) = split(/:/,$user);
@@ -749,20 +841,25 @@ sub form_elements {
 
 sub store_mail {
     my ($subject,$message,$domain,$recipients,$attachmenturl,$ltext) = @_;
-    my %servers = ();
-    my $msgid=&packagemail($subject,$message,$domain,
-                           $recipients,\%servers,$attachmenturl);
-# Store in dc email db files on appropriate servers.
-    foreach my $server (keys(%servers)) {
-        unless (&Apache::lonnet::dcmailput($domain,$msgid,\%servers,$server) eq 'ok') {
-            &Apache::lonnet::logthis('Storage of dc mail failed for domain'.$domain.' for server: '.
-                      $server.'.  Message ID was '.$msgid);
+    my $msgid;
+    ($msgid,$message) = &packagemail($subject,$message,$domain,$recipients,
+                                                               $attachmenturl);
+# Store in dc email db files on primary library server for domain.
+    my $server = $Apache::lonnet::domain_primary{$domain};
+    if (defined($server)) {
+        unless (&Apache::lonnet::dcmailput($domain,$msgid,$message,$server) 
+                                                            eq 'ok') {
+            &Apache::lonnet::logthis('Storage of dc mail failed for domain'.
+                 $domain.' for server: '. $server.'.  Message ID was '.$msgid);
         }
+    } else {
+        &Apache::lonnet::logthis('Storage of dc mail failed for domain'.
+           $domain.' as no primary server identified. Message ID was '.$msgid);
     }
 }
 
 sub packagemail {
-    my ($subject,$message,$dom,$recipients,$servers,$attachmenturl,$ltext) = @_;
+    my ($subject,$message,$dom,$recipients,$attachmenturl) = @_;
     my %record = ();
     my $partsubj=$subject;
     $partsubj=&Apache::lonnet::escape($partsubj);
@@ -793,19 +890,12 @@ sub packagemail {
         my ($username,$email) = split(/:/,$recip);
         $username = &Apache::lonnet::unescape($username);
         $email = &Apache::lonnet::unescape($email);
-        my ($uname,$udom) = split(/:/,$username);
-        my $uhom=&Apache::lonnet::homeserver($uname,$udom);
-        if ($uhom ne 'no_host') {
-            $username = &HTML::Entities::encode($username,'<>&"');
-            $email = &HTML::Entities::encode($email,'<>&"');
-            $record{$uhom} .= '<recipient username="'.$username.'">'.
+        $username = &HTML::Entities::encode($username,'<>&"');
+        $email = &HTML::Entities::encode($email,'<>&"');
+        $result .= '<recipient username="'.$username.'">'.
                               $email.'</recipient>';
-        }
-    }
-    foreach my $server (keys(%record)) {
-        $$servers{$server} = $result.$record{$server};
     }
-    return $msgid;
+    return ($msgid,$result);
 }
 
 sub unpackagemail {
@@ -845,30 +935,10 @@ sub unpackagemail {
     return %content;
 }
 
-sub echo_form_input {
-    my (@excluded) = @_;
-    my $output = '';
-    foreach my $key (keys(%env)) {
-        if ($key =~ /^form\.(.+)$/) {
-            if ((!@excluded) || (!grep/^$1$/,@excluded)) {
-                if (ref($env{$key})) {
-                    foreach my $value (@{$env{$key}}) {
-                        $output .= qq(<input type="hidden" name="$1" value="$value" />\n);
-                    }
-                } else {
-                    $output .= qq(<input type="hidden" name="$1" value="$env{$key}" />\n);
-                }
-            }
-        }
-    }
-    return $output;
-}
-
 sub cr_to_br {
     my $incoming = shift;
     $incoming =~ s/\n/\<br \/\>/g;
     return $incoming;
 }
 
-
 1;