--- loncom/interface/lonrequestcourse.pm	2009/08/18 20:06:51	1.17
+++ loncom/interface/lonrequestcourse.pm	2009/08/23 03:51:53	1.24
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Request a course
 #
-# $Id: lonrequestcourse.pm,v 1.17 2009/08/18 20:06:51 raeburn Exp $
+# $Id: lonrequestcourse.pm,v 1.24 2009/08/23 03:51:53 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -116,13 +116,11 @@ 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::lonhtmlcommon::clear_breadcrumbs();
     my $dom = &get_course_dom();
@@ -159,9 +157,10 @@ sub handler {
     $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');
         }
     }
 
@@ -364,30 +363,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 +426,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 +443,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;
                         }
                     }
@@ -791,7 +790,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 +808,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') {
@@ -848,6 +854,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 +909,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 +975,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>'.
@@ -1422,32 +1435,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();
@@ -1464,9 +1480,9 @@ sub print_review {
                 $inst_values .= '<td>'.$courseenv{'description'}.'&nbsp;';
                 my $cloneinst = $courseenv{'internal.coursecode'};
                 if ($cloneinst ne '') {
-                    $inst_values .= &mt('([_1] in [_2])',$cloneinst,$env{'form.clonedom'});
+                    $inst_values .= $cloneinst.' '.&mt('in').' '.$env{'form.clonedom'};
                 } else {
-                    $inst_values .= &mt('(from [_1])',$env{'form.clonedom'});
+                    $inst_values .= &mt('from').' '.$env{'form.clonedom'};
                 }
                 $inst_values .= '</td><td>';
                 if ($env{'form.datemode'} eq 'preserve') {
@@ -1523,10 +1539,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>'.
@@ -1749,17 +1771,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 +1846,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 +1889,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 +1959,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 +2011,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 +2035,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 +2043,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';
@@ -2114,7 +2160,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 +2207,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 +2220,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 +2273,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_');
         }
@@ -2301,17 +2353,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 +2372,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 +2410,7 @@ sub retrieve_settings {
                                                 if (grep(/^\Q$sec\E/,@currsec)) {
                                                     $env{'form.person_'.$i.'_sec'} = $sec;
                                                 } else {
-                                                    push (@newsecs,$sec);
+                                                    push(@newsecs,$sec);
                                                 }
                                             }
                                         }
@@ -2399,26 +2456,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};
                 }
             }
         }