--- loncom/interface/lonrequestcourse.pm	2009/08/19 20:12:04	1.18
+++ loncom/interface/lonrequestcourse.pm	2009/08/27 00:06:18	1.26
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Request a course
 #
-# $Id: lonrequestcourse.pm,v 1.18 2009/08/19 20:12:04 raeburn Exp $
+# $Id: lonrequestcourse.pm,v 1.26 2009/08/27 00:06:18 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -116,21 +116,48 @@ use LONCAPA qw(:DEFAULT :match);
 
 sub handler {
     my ($r) = @_;
+    &Apache::loncommon::content_type($r,'text/html');
+    $r->send_http_header;
     if ($r->header_only) {
-        &Apache::loncommon::content_type($r,'text/html');
-        $r->send_http_header;
         return OK;
     }
-    &Apache::loncommon::content_type($r,'text/html');
-    $r->send_http_header;
 
+    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['action','showdom','cnum']);
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     my $dom = &get_course_dom();
     my $action = $env{'form.action'};
     my $state = $env{'form.state'};
     my %stored;
     my $jscript;
-    if ((defined($state)) && (defined($action))) {
+    my ($uname,$udom,$result,$warning);
+    if ($action eq 'display') {
+        if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
+            my $namespace = 'courserequestqueue';
+            if ($env{'form.cnum'} ne '') {
+                my $cnum = $env{'form.cnum'};
+                my $reqkey = $cnum.'_approval';
+                my $namespace = 'courserequestqueue';
+                my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);
+                my %queued =
+                    &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);
+                if (ref($queued{$reqkey}) eq 'HASH') {
+                    $uname = $queued{$reqkey}{'ownername'};
+                    $udom  = $queued{$reqkey}{'ownerdom'};
+                    if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
+                        $result = &retrieve_settings($dom,$cnum,$udom,$uname);
+                    } else {
+                        $warning = &mt('Invalid username or domain for course requestor');
+                    }
+                } else {
+                    $warning = &mt('No information was found for this course request.');
+                }
+            } else {
+                $warning = &mt('No course request ID provided.');
+            }
+        } else {
+            $warning = &mt('You do not have rights to view course request information.');
+        }
+    } elsif ((defined($state)) && (defined($action))) {
         if (($action eq 'view') && ($state eq 'details')) {
             if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) {
                 my $result = &retrieve_settings($env{'form.showdom'},$env{'form.cnum'});
@@ -156,12 +183,14 @@ sub handler {
     my $loaditems = &onload_action($action,$state);
 
     my %states;
+    $states{'display'} = ['details'];
     $states{'view'} = ['pick_request','details','cancel','removal'];
     $states{'log'} = ['filter','display'];
     $states{'new'} = ['courseinfo','enrollment','personnel','review','process'];
+
     if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) {
         unless ($env{'form.state'} eq 'crstype') {
-            unshift (@{$states{'new'}},'codepick');
+            unshift(@{$states{'new'}},'codepick');
         }
     }
 
@@ -246,10 +275,21 @@ sub handler {
         }
     } elsif ($action eq 'view') {
         if ($state eq 'crstype') {
-           &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb);
+            &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb);
         } else {
-           &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
-                                   $loaditems,$crumb);
+            &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
+                                    $loaditems,$crumb);
+        }
+    } elsif ($action eq 'display') {
+        if ($warning ne '') {
+            my $args = { only_body => 1 };
+            $r->print(&header('Course Requests','','',$args).$crumb.
+                      '<h3>'.&mt('Course Request Details').'</h3>'.
+                      '<div class="LC_warning">'.$warning.'</div>'.
+                      &close_popup_form());
+        } else {
+            &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
+                                    $loaditems,$crumb,$uname,$udom);
         }
     } elsif ($action eq 'log') {
         &print_request_logs($jscript,$loaditems,$crumb);
@@ -260,18 +300,24 @@ sub handler {
 }
 
 sub header {
-    my ($bodytitle,$jscript,$loaditems,$jsextra) = @_;
+    my ($bodytitle,$jscript,$loaditems,$jsextra,$args) = @_;
     if ($jscript) {
         $jscript = '<script type="text/javascript">'."\n".
                    '// <![CDATA['."\n".
                    $jscript."\n".'// ]]>'."\n".'</script>'."\n";
     }
     if ($loaditems) {
-        $loaditems = {'add_entries' => $loaditems,};
-        return &Apache::loncommon::start_page($bodytitle,$jscript.$jsextra,$loaditems);
-    } else {
-        return &Apache::loncommon::start_page($bodytitle,$jscript.$jsextra);
+        if (ref($args) eq 'HASH') {
+            my %loadhash = (
+                             'add_entries' => $loaditems,
+                           );
+            my %arghash = (%loadhash,%{$args});
+            $args = \%arghash;                  
+        } else {
+            $args = {'add_entries' => $loaditems,};
+        }
     }
+    return &Apache::loncommon::start_page($bodytitle,$jscript.$jsextra,$args);
 }
 
 sub form_elements {
@@ -364,30 +410,28 @@ sub form_elements {
             for (my $i=0; $i<$env{'form.sectotal'}; $i++) {
                 $extras{'sec_'.$i} = 'checkbox',
                 $extras{'secnum_'.$i} = 'text',
-                $extras{'loncapasec_'.$i} = 'checkbox',
+                $extras{'loncapasec_'.$i} = 'text',
             }
         }
         my $crosslisttotal = $env{'form.crosslisttotal'};
         if ($env{'form.addcrosslist'}) {
             $crosslisttotal ++;
         }
-        if (!defined($crosslisttotal)) {
+        if (!$crosslisttotal) {
             $crosslisttotal = 1;
         }
-        if ($crosslisttotal > 0) {
-            for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {
-                if ($numtitles) {
-                    $extras{'crosslist_'.$i.'_'.$lastitem} = 'text';
-                }
-                if (@codetitles > 0) {
-                    foreach my $item (@codetitles) {
-                        $extras{'crosslist_'.$i.'_'.$item} = 'selectbox';
-                    }
+        for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {
+            if ($numtitles) {
+                $extras{'crosslist_'.$i.'_'.$lastitem} = 'text';
+            }
+            if (@codetitles > 0) {
+                foreach my $item (@codetitles) {
+                    $extras{'crosslist_'.$i.'_'.$item} = 'selectbox';
                 }
-                $extras{'crosslist_'.$i} = 'checkbox';
-                $extras{'crosslist_'.$i.'_instsec'} = 'text',
-                $extras{'crosslist_'.$i.'_lcsec'} = 'text',
             }
+            $extras{'crosslist_'.$i} = 'checkbox';
+            $extras{'crosslist_'.$i.'_instsec'} = 'text',
+            $extras{'crosslist_'.$i.'_lcsec'} = 'text',
         }
         my %mergedhash = (%{$elements{'new'}{'enrollment'}},%extras);
         %{$elements{'new'}{'enrollment'}} = %mergedhash;
@@ -429,6 +473,8 @@ sub check_can_request {
     my ($dom,$can_request) = @_;
     my $canreq = 0;
     my ($types,$typename) = &course_types();
+    my @options = ('approval','validate','autolimit');
+    my $optregex = join('|',@options);
     if ((ref($can_request) eq 'HASH') && (ref($types) eq 'ARRAY')) {
         foreach my $type (@{$types}) {
             if (&Apache::lonnet::usertools_access($env{'user.name'},
@@ -444,7 +490,7 @@ sub check_can_request {
                 if (@curr > 0) {
                     $canreq ++;
                     unless ($dom eq $env{'user.domain'}) {
-                        if (grep(/^\Q$dom\E$/,@curr)) {
+                        if (grep(/^\Q$dom\E:($optregex)(=?\d*)$/,@curr)) {
                             $can_request->{$type} = 1;
                         }
                     }
@@ -602,7 +648,7 @@ END
 }
 
 sub request_administration {
-    my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb) = @_;
+    my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb,$uname,$udom) = @_;
     my $js;
     if (($action eq 'new') || (($action eq 'view') && ($state eq 'pick_request'))) {
         $js =  <<END;
@@ -662,7 +708,7 @@ END
                                                          \%cat_order,\@code_order);
             }
             $r->print('<h3>'.&mt('Course Request Details').'</h3><div>'."\n".$form."\n".
-                      &print_review($formname,$dom,\@codetitles,\%cat_titles,\%cat_order,
+                      &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,
                                     \@code_order)."\n".
                       '<input name="origcnum" value="'.$origcnum.'" type="hidden" />'."\n");
             my @excluded = &get_excluded_elements($dom,$states,'new','review');
@@ -735,6 +781,18 @@ END
             }
             $r->print('</form>');
         }
+    } elsif ($action eq 'display') {
+        my $formname = 'requestcrs';
+        my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);
+        if ($env{'form.crstype'} eq 'official') {
+            &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
+                                                     \%cat_order,\@code_order);
+        }
+        $r->print(&header('Course Request','','','',{ 'only_body' => 1}).
+                  $crumb."\n".'<h3>'.&mt('Course Request Details').'</h3>'.
+                  &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,
+                                \@code_order,$uname,$udom)."\n".'</div>'.
+                  &close_popup_form());
     } elsif ($action eq 'log') {
         $r->print(&coursereq_log('View request log',$jscript,$loaditems).$crumb);
     }
@@ -742,6 +800,15 @@ END
     return;
 }
 
+sub close_popup_form {
+    my $close= &mt('Close Window');
+    return << "END";
+<p><form name="displayreq" action="" method="post">
+<input type="button" name="closeme" value="$close" onclick="javascript:self.close();" />
+</form></p>
+END
+}
+
 sub print_request_form {
     my ($r,$action,$state,$page,$states,$dom) = @_;
     my $formname = 'requestcrs';
@@ -791,7 +858,7 @@ sub print_request_form {
                 $message = '<div class="LC_warning">'.
                            &mt('No course was found matching your choice of institutional course category.');
             }
-            unless ($code_chk eq 'ok') {
+            unless ($code_chk eq 'valid') {
                 $prev = 'crstype';
             }
             $r->print($message);
@@ -809,12 +876,19 @@ sub print_request_form {
                 $r->print('<div>'.&Apache::lonhtmlcommon::start_pick_box().$codepicker.
                           &Apache::lonhtmlcommon::end_pick_box().'</div>');
             } else {
+                $next = $states->{$action}[$page+2];
                 $r->print(&courseinfo_form($dom,$formname,$crstype,$next));
             }
         } else {
+            if ($crstype eq 'official') {
+                $next = $states->{$action}[$page+2];
+            }
             $r->print(&courseinfo_form($dom,$formname,$crstype,$next));
         }
     } elsif ($prev eq 'codepick') {
+        if ($env{'form.instcode'} eq '') {
+            $prev = $states->{$action}[$page-2];
+        }
         $r->print(&courseinfo_form($dom,$formname,$crstype,$next));
     } elsif ($state eq 'enrollment') {
         if ($crstype eq 'official') {
@@ -835,8 +909,7 @@ sub print_request_form {
         &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                  \%cat_order,\@code_order);
         $r->print('<p>'.&mt('Review the details of the course request before submission.').'</p>'.
-                  &print_review($formname,$dom,\@codetitles,\%cat_titles,\%cat_order,
-                                \@code_order).
+                  &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order).
                   '<input type="hidden" name="cnum" value="'.$cnum.'" />');
         $navtxt{'next'} = &mt('Submit course request');
     }  elsif ($state eq 'process') {
@@ -848,6 +921,9 @@ sub print_request_form {
         $r->print($result);
     }
     my @excluded = &get_excluded_elements($dom,$states,$action,$state);
+    if ($state eq 'personnel') {
+        push(@excluded,'persontotal');
+    }
     $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</form>');
     &display_navbuttons($r,$formname,$prev,$navtxt{'prev'},$next,$navtxt{'next'},$state);
     return;
@@ -900,7 +976,7 @@ sub print_enrollment_menu {
             my ($section_form,$crosslist_form,$autoenroll_form);
             $section_form = &inst_section_selector($dom,$instcode);
             my $crosslisttotal = $env{'form.crosslisttotal'};
-            if (!defined($crosslisttotal)) {
+            if (!$crosslisttotal) {
                 $crosslisttotal = 1;
             }
             if ($env{'form.addcrosslist'}) {
@@ -966,15 +1042,19 @@ sub inst_section_selector {
                     &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_row().
                     '<th>'.&mt('Include?').'<input type="hidden" name="sectotal" '.
-                    'value="'.$sectotal.'"</th>'.
+                    'value="'.$sectotal.'"  /></th>'.
                     '<th>'.&mt('Institutional Section').'</th>'.
                     '<th>'.&mt('LON-CAPA section').'</th>'.
                     &Apache::loncommon::end_data_table_row();
         for (my $i=0; $i<@sections; $i++) {
             my $colflag = $i%2;
+            my $checked = ' checked="checked"';
+            if ($env{'form.origcnum'}) {
+                $checked='';
+            }
             $output .= &Apache::loncommon::start_data_table_row().
                        '<td><input type="checkbox" name="sec_'.$i.
-                       '" checked="checked" /></td>'.
+                       '"'.$checked.' value="1" /></td>'.
                        '<td>'.$sections[$i].
                        '<input type="hidden" name="secnum_'.$i.'" value="'.
                        $sections[$i].'" /></td>'.
@@ -1337,13 +1417,16 @@ sub print_request_logs {
 }
 
 sub print_review {
-    my ($formname,$dom,$codetitles,$cat_titles,$cat_order,$code_order) = @_;
+    my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom) = @_;
     my ($types,$typename) = &course_types();
     my ($owner,$ownername,$owneremail);
-    $owner = $env{'user.name'}.':'.$env{'user.domain'};
-    $ownername = &Apache::loncommon::plainname($env{'user.name'},
-                                               $env{'user.domain'},'first');
-    my %emails = &Apache::loncommon::getemails();
+    if ($uname eq '' || $udom eq '') {
+        $uname = $env{'user.name'};
+        $udom = $env{'user.domain'};
+    }
+    $owner = $uname.':'.$udom;
+    $ownername = &Apache::loncommon::plainname($uname,$udom,'first');
+    my %emails = &Apache::loncommon::getemails($uname,$udom);
     foreach my $email ('permanentemail','critnotification','notification') {
         $owneremail = $emails{$email};
         last if ($owneremail ne '');
@@ -1422,32 +1505,35 @@ sub print_review {
                                &mt('Institutional course/section').'</th>'.
                                '<th>'.&mt('LON-CAPA section').'</th></tr>';
             my $xlistinfo;
-            if ($env{'form.crosslisttotal'}) {
-                for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {
-                    if ($env{'form.crosslist_'.$i}) {
-                        $xlistinfo .= '<tr><td>';
-                        if (ref($code_order) eq 'ARRAY') {
-                            if (@{$code_order} > 0) {
-                                foreach my $item (@{$code_order}) {
-                                    $xlistinfo .= $env{'form.crosslist_'.$i.'_'.$item};
-                                }
+            my $crosslisttotal = $env{'form.crosslisttotal'};
+            if (!$crosslisttotal) {
+                $crosslisttotal = 1;
+            }
+            for (my $i=0; $i<$crosslisttotal; $i++) {
+                if ($env{'form.crosslist_'.$i}) {
+                    $xlistinfo .= '<tr><td>';
+                    if (ref($code_order) eq 'ARRAY') {
+                        if (@{$code_order} > 0) {
+                            foreach my $item (@{$code_order}) {
+                                $xlistinfo .= $env{'form.crosslist_'.$i.'_'.$item};
                             }
                         }
-                        $xlistinfo .= $env{'form.crosslist_'.$i.'_instsec'}.'</td><td>';
-                        if ($env{'form.crosslist_'.$i.'_lcsec'}) {
-                            $xlistinfo .= $env{'form.crosslist_'.$i.'_lcsec'};
-                        } else {
-                            $xlistinfo .= &mt('None');
-                        }
-                        $xlistinfo .= '</td></tr>';
                     }
+                    $xlistinfo .= $env{'form.crosslist_'.$i.'_instsec'}.'</td><td>';
+                    if ($env{'form.crosslist_'.$i.'_lcsec'}) {
+                        $xlistinfo .= $env{'form.crosslist_'.$i.'_lcsec'};
+                    } else {
+                        $xlistinfo .= &mt('None');
+                    }
+                    $xlistinfo .= '</td></tr>';
                 }
             }
             if ($xlistinfo eq '') {
                 $xlistinfo = '<tr><td colspan="2">'.&mt('None').'</td></tr>';
             }
-            $section_values .= $xlistinfo.'</table></td>';
+            $section_values .= $xlistinfo;
         }
+        $section_values .= '</table></td>';
     }
 
     my %ctxt = &clone_text();
@@ -1523,10 +1609,16 @@ sub print_review {
                     }
                 }
             }
-            my $showsec = 'None';
+            my $showsec;
             if (@allsecs) {
                 $showsec = join(', ',@allsecs);
             }
+            if ($showsec eq '') {
+                $showsec = &mt('None');
+            }
+            if ($env{'form.person_'.$i.'_role'} eq 'cc') {
+                $showsec = &mt('None');
+            }
             $personnel_values .= 
                 '<tr><td>'.$env{'form.person_'.$i.'_firstname'}.' '.
                 $env{'form.person_'.$i.'_lastname'}.'</td>'.
@@ -1567,7 +1659,7 @@ sub print_review {
                '<table class="LC_innerpickbox"><tr>'.$personnel_headers.'</tr>'."\n".
                $personnel_values.'</table>'."\n".
                &Apache::lonhtmlcommon::row_closure(1).
-               &Apache::lonhtmlcommon::end_pick_box();
+               &Apache::lonhtmlcommon::end_pick_box().'</div>';
     return $output;
 }
 
@@ -1749,17 +1841,47 @@ sub coursecode_form {
 
 sub get_course_dom {
     my $codedom = &Apache::lonnet::default_login_domain();
+    if ($env{'form.showdom'} ne '') {
+        if (&Apache::lonnet::domain($env{'form.showdom'}) ne '') {
+            return $env{'form.showdom'};
+        }
+    }
     if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne 'public')) {
+        my ($types,$typename) = &course_types();
+        if (ref($types) eq 'ARRAY') {
+            foreach my $type (@{$types}) {
+                if (&Apache::lonnet::usertools_access($env{'user.name'},
+                                                      $env{'user.domain'},$type,
+                                                      undef,'requestcourses')) {
+                    return $env{'user.domain'};
+                }
+            }
+            my @possible_doms;
+            foreach my $type (@{$types}) {
+                my $dom_str = $env{'environment.reqcrsotherdom.'.$type};
+                if ($dom_str ne '') {
+                    my @domains = split(',',$dom_str);
+                    foreach my $entry (@domains) {
+                        my ($extdom,$extopt) = split(':',$entry);
+                        if ($extdom eq $env{'request.role.domain'}) {
+                            return $extdom;
+                        } 
+                        unless(grep(/^\Q$extdom\E$/,@possible_doms)) {
+                            push(@possible_doms,$extdom);
+                        }
+                    }
+                }
+            }
+            if (@possible_doms) {
+                @possible_doms = sort(@possible_doms);
+                return $possible_doms[0];
+            }
+        }
         $codedom = $env{'user.domain'};
         if ($env{'request.role.domain'} ne '') {
             $codedom = $env{'request.role.domain'};
         }
     }
-    if ($env{'form.showdom'} ne '') {
-        if (&Apache::lonnet::domain($env{'form.showdom'}) ne '') {
-            $codedom = $env{'form.showdom'};
-        }
-    }
     return $codedom;
 }
 
@@ -1794,6 +1916,8 @@ sub print_request_outcome {
     my ($dom,$codetitles,$code_order) = @_;
     my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend,
         %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,);
+    my $sectotal = $env{'form.sectotal'};
+    my $crosslisttotal = 0;
     $cnum = $env{'form.cnum'};
     unless ($cnum =~ /^$match_courseid$/) {
         $output = &mt('Invalid LON-CAPA course number for the new course')."\n"; 
@@ -1835,8 +1959,11 @@ sub print_request_outcome {
                         }
                     }
                 }
-                $xlistinfo .= $env{'form.crosslist_'.$i.'_instsec'};
-                $crosslistings{$i}{'inst'} = $xlistinfo;
+                $crosslistings{$i}{'instcode'} = $xlistinfo;
+                if ($xlistinfo ne '') {
+                    $crosslisttotal ++;
+                }
+                $crosslistings{$i}{'instsec'} = $env{'form.crosslist_'.$i.'_instsec'}; 
                 $crosslistings{$i}{'loncapa'} = $env{'form.crosslist_'.$i.'_lcsec'};
             }
         }
@@ -1902,17 +2029,9 @@ sub print_request_outcome {
     if ($env{'form.autoadds'}) {
         $autodrops = $env{'form.autoadds'};
     }
-    my $sectotal = 0;
-    if ($env{'form.sectotal'}) {
-        $sectotal = $env{'form.sectotal'};
-    }
     if ($env{'form.autoadds'}) {
         $autodrops = $env{'form.autoadds'};
     }
-    my $crosslisttotal = 0;
-    if ($env{'form.crosslisttotal'}) {
-        $crosslisttotal = $env{'form.crosslisttotal'};
-    }
     my $instcode = '';
     if (exists($env{'form.instcode'})) {
         $instcode = $env{'form.instcode'};
@@ -1962,9 +2081,9 @@ sub print_request_outcome {
     my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig);
     if ($val eq '') {
         if ($crstype eq 'official') {
-            $output = &mt('You are not permitted to request creation of official courses');
+            $output = &mt('You are not permitted to request creation of official courses.');
         } elsif ($crstype eq 'unofficial') {
-            $output = &mt('You are not permitted to request creation of unofficial courses');
+            $output = &mt('You are not permitted to request creation of unofficial courses.');
         } elsif ($crstype eq 'community') {
             $output = &mt('You are not permitted to request creation of communities');
         } else {
@@ -1986,7 +2105,7 @@ sub print_request_outcome {
             $disposition = &check_autolimit($env{'user.name'},$env{'user.domain'},
                                             $dom,$crstype,$limit,\$message);
         } elsif ($val eq 'validate') {
-            my $inststatuslist;
+            my ($inststatuslist,$validationchk,$validation);
             if (@inststatuses > 0) {
                 $inststatuslist = join(',',@inststatuses);
             }
@@ -1994,23 +2113,20 @@ sub print_request_outcome {
             if (@instsections > 0) {
                 $instseclist = join(',',@instsections);
             }
-            my $validation = 
-                &Apache::lonnet::auto_validate_instcode('',$dom,$instcode,
-                    $env{'user.name'}.':'.$env{'user.domain'},$inststatuslist,
-                    $instseclist);
-            if ($validation eq 'valid') {
-                $disposition = 'process';
-            } elsif ($validation eq 'rejected') {
-                $disposition = 'rejected';
-            } elsif ($validation eq 'pending') {
-                $disposition = 'pending';
-            } elsif ($disposition eq 'approval') {
-                $disposition = 'approval';
-            } elsif ($disposition =~ /^error(.*)$/) {
+            $validationchk = 
+                &Apache::lonnet::auto_courserequest_validation($dom,
+                    $env{'user.name'}.':'.$env{'user.domain'},$crstype,
+                    $inststatuslist,$instcode,$instseclist);
+            if ($validationchk =~ /:/) {
+                ($validation,$message) = split(':',$validationchk);
+            } else {
+                $validation = $validationchk;
+            }
+            if ($validation =~ /^error(.*)$/) {
                 $disposition = 'approval';
                 $validationerror = $1;
             } else {
-                $disposition = 'approval';  
+                $disposition = $validation;
             }
         } else {
             $disposition = 'approval';
@@ -2066,9 +2182,10 @@ sub print_request_outcome {
                                                    $env{'user.domain'},$env{'user.name'});
             if ($userreqhash{$statuskey} ne '') {
                 $modified = 1;
-                my %queuehash = &Apache::lonnet::get_dom('courserequestqueue',
-                                                         [$cnum.'_approval',
-                                                          $cnum.'_pending'],$dom);
+                my $uname = &Apache::lonnet::get_domainconfiguser($dom);
+                my %queuehash = &Apache::lonnet::get('courserequestqueue',
+                                                     [$cnum.'_approval',
+                                                      $cnum.'_pending'],$dom,$uname);
                 if (($queuehash{$cnum.'_approval'} ne '') || 
                     ($queuehash{$cnum.'_pending'} ne '')) {
                     $queued = 1;
@@ -2114,7 +2231,7 @@ sub print_request_outcome {
                        &notification_information($disposition,$req_notifylist,$cnum,$now);
         }
         if ($validationerror ne '') {
-            $output .= '<span class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: {_1].',$validationerror).'</p>';
+            $output .= '<span class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>';
         }
     }
     return $output;
@@ -2161,7 +2278,7 @@ sub get_processtype {
     my ($dom,$crstype,$inststatuses,$domconfig) = @_;
     return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));
     my (%userenv,%settings,$val);
-    my @options = ('autolimit','validate','approve');
+    my @options = ('autolimit','validate','approval');
     if ($dom eq $env{'user.domain'}) {
         %userenv = 
             &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'},
@@ -2174,7 +2291,7 @@ sub get_processtype {
             if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
                 %settings = %{$domconfig->{'requestcourses'}};
                 if (ref($settings{$crstype}) eq 'HASH') {
-                    if (($env{'user.adv'}) && (exists($settings{$crstype}{'_LC_adv'}))) {
+                    if (($env{'user.adv'}) && ($settings{$crstype}{'_LC_adv'} ne '')) {
                         $val = $settings{$crstype}{'_LC_adv'};
                         @{$inststatuses} = ('_LC_adv_');
                     } else {
@@ -2227,11 +2344,17 @@ sub get_processtype {
     } else {
         %userenv = &Apache::lonnet::userenvironment($env{'user.domain'},
                       $env{'user.name'},'reqcrsotherdom.'.$env{'form.crstype'});
-        if ($userenv{'reqcrsotherdom'}) {
-            my @doms = split(',',$userenv{'reqcrsotherdom'});
-            my $optregex = join('|',@options); 
-            if (grep(/^\Q$dom\E:($optregex=?\d*)/,@doms)) {
-                $val = $1;
+        if ($userenv{'reqcrsotherdom.'.$crstype}) {
+            my @doms = split(',',$userenv{'reqcrsotherdom.'.$crstype});
+            my $optregex = join('|',@options);
+            foreach my $item (@doms) {
+                my ($extdom,$extopt) = split(':',$item);
+                if ($extdom eq $dom) {  
+                    if ($extopt =~ /^($optregex)(=?\d*)$/) {
+                        $val = $1.$2;
+                    }
+                    last;
+                }
             }
             @{$inststatuses} = ('_external_');
         }
@@ -2274,11 +2397,14 @@ sub check_autolimit {
 }
 
 sub retrieve_settings {
-    my ($dom,$cnum) = @_;
-    my ($result,%reqinfo) = &get_request_settings($dom,$cnum);
+    my ($dom,$cnum,$udom,$uname) = @_;
+    if ($udom eq '' || $uname eq '') {
+        $udom = $env{'user.domain'};
+        $uname = $env{'user.name'};
+    }
+    my ($result,%reqinfo) = &get_request_settings($dom,$cnum,$udom,$uname);
     if ($result eq 'ok') {
-        if (($env{'user.name'} eq $reqinfo{'owner'}) && 
-            ($env{'user.domain'} eq $reqinfo{'domain'})) {
+        if (($udom eq $reqinfo{'domain'}) &&  ($uname eq $reqinfo{'owner'})) {
             $env{'form.chome'} = $reqinfo{'coursehome'};
             $env{'form.cdescr'} = $reqinfo{'cdescr'};
             $env{'form.crstype'} = $reqinfo{'crstype'}; 
@@ -2301,17 +2427,18 @@ sub retrieve_settings {
                  $env{'form.autoadds'} = $reqinfo{'autoadds'};
                  $env{'form.autdrops'} = $reqinfo{'autodrops'};
                  $env{'form.instcode'} = $reqinfo{'instcode'};
-                 my %crscode = (
-                                 instcode => $reqinfo{'instcode'},
-                               );
-                 &extract_instcode($dom,'instcode',\%crscode);
+                 my $crscode = { 
+                                 $cnum => $reqinfo{'instcode'},
+                               };
+                 &extract_instcode($dom,'instcode',$crscode,$cnum);
             }
             my @currsec;
             if (ref($reqinfo{'sections'}) eq 'HASH') {
                 foreach my $i (sort(keys(%{$reqinfo{'sections'}}))) {
                     if (ref($reqinfo{'sections'}{$i}) eq 'HASH') {
-                        my $sec = $reqinfo{'sections'}{$i}{'inst'};;
+                        my $sec = $reqinfo{'sections'}{$i}{'inst'};
                         $env{'form.secnum_'.$i} = $sec;
+                        $env{'form.sec_'.$i} = '1';
                         if (!grep(/^\Q$sec\E$/,@currsec)) {
                             push(@currsec,$sec);
                         }
@@ -2319,15 +2446,19 @@ sub retrieve_settings {
                     }
                 }
             }
-            if (ref($reqinfo{'crosslistings'}) eq 'HASH') {
-                foreach my $i (sort(keys(%{$reqinfo{'crosslistings'}}))) {
-                    if (ref($reqinfo{'crosslistings'}{$i}) eq 'HASH') {
-                        $env{'form.crosslist_'.$i.'_lcsec'} = $reqinfo{'crosslistings'}{$i}{'loncapa'};
-                        my $xlistsec = $reqinfo{'crosslistings'}{$i}{'instsec'};
-                        my %crscode = (
-                                        $i => $reqinfo{'crosslistings'}{$i}{'instcode'},
-                                      );
-                        &extract_instcode($dom,'crosslist',\%crscode,$1,$xlistsec);
+            if (ref($reqinfo{'crosslists'}) eq 'HASH') {
+                foreach my $i (sort(keys(%{$reqinfo{'crosslists'}}))) {
+                    if (ref($reqinfo{'crosslists'}{$i}) eq 'HASH') {
+                        $env{'form.crosslist_'.$i} = '1';
+                        $env{'form.crosslist_'.$i.'_instsec'} = $reqinfo{'crosslists'}{$i}{'instsec'};
+                        $env{'form.crosslist_'.$i.'_lcsec'} = $reqinfo{'crosslists'}{$i}{'loncapa'};
+                        if ($reqinfo{'crosslists'}{$i}{'instcode'} ne '') {
+                            my $key = $cnum.$i; 
+                            my $crscode = {
+                                              $key => $reqinfo{'crosslists'}{$i}{'instcode'},
+                                          };
+                            &extract_instcode($dom,'crosslist',$crscode,$key,$i);
+                        }
                     }
                 }
             }
@@ -2353,7 +2484,7 @@ sub retrieve_settings {
                                                 if (grep(/^\Q$sec\E/,@currsec)) {
                                                     $env{'form.person_'.$i.'_sec'} = $sec;
                                                 } else {
-                                                    push (@newsecs,$sec);
+                                                    push(@newsecs,$sec);
                                                 }
                                             }
                                         }
@@ -2375,12 +2506,11 @@ sub retrieve_settings {
 }
 
 sub get_request_settings {
-    my ($dom,$cnum) = @_;
+    my ($dom,$cnum,$udom,$uname) = @_;
     my $requestkey = $dom.'_'.$cnum;
     my ($result,%reqinfo);
     if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
-        my %history = &Apache::lonnet::restore($requestkey,'courserequests',
-                                               $env{'user.domain'},$env{'user.name'});
+        my %history = &Apache::lonnet::restore($requestkey,'courserequests',$udom,$uname);
         my $disposition = $history{'disposition'};
         if (($disposition eq 'approval') || ($disposition eq 'pending')) { 
             if (ref($history{'details'}) eq 'HASH') {
@@ -2399,26 +2529,19 @@ sub get_request_settings {
 }
 
 sub extract_instcode {
-    my ($cdom,$element,$crscodehashref,$counter,$xlistsec) = @_;
+    my ($cdom,$element,$crscode,$crskey,$counter) = @_;
     my (%codes,@codetitles,%cat_titles,%cat_order);
-    if (ref($crscodehashref) eq 'HASH') {
-        if (&Apache::lonnet::auto_instcode_format('requests',$cdom,$crscodehashref,
-                       \%codes,\@codetitles,\%cat_titles,\%cat_order) eq 'ok') {
+    if (&Apache::lonnet::auto_instcode_format('requests',$cdom,$crscode,\%codes,
+                                              \@codetitles,\%cat_titles,
+                                              \%cat_order) eq 'ok') {
+        if (ref($codes{$crskey}) eq 'HASH') {
             if (@codetitles > 0) {
                 my $sel = $element;
                 if ($element eq 'crosslist') {
                     $sel .= '_'.$counter;
                 }
-                my $lastitem = pop(@codetitles);
                 foreach my $title (@codetitles) {
-                    if (ref($cat_order{$title}) eq 'ARRAY') {
-                        if (@{$cat_order{$title}} > 0) {
-                            $env{'form.'.$sel.'_'.$title} = $cat_order{$title}[0];
-                        }
-                    }
-                }
-                if ($element eq 'crosslist') { 
-                    $env{'form.'.$sel.'_'.$lastitem} = $xlistsec; 
+                    $env{'form.'.$sel.'_'.$title} = $codes{$crskey}{$title};
                 }
             }
         }