--- loncom/interface/coursecatalog.pm	2008/07/07 15:20:18	1.36
+++ loncom/interface/coursecatalog.pm	2009/10/28 17:28:17	1.48.2.2
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler for displaying the course catalog interface
 #
-# $Id: coursecatalog.pm,v 1.36 2008/07/07 15:20:18 raeburn Exp $
+# $Id: coursecatalog.pm,v 1.48.2.2 2009/10/28 17:28:17 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -53,7 +53,8 @@ sub handler {
     }
     &Apache::lonacc::get_posted_cgi($r);
     &Apache::lonlocal::get_language_handle($r);
-    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']);
+    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+                                            ['sortby','showdom']);
 
     my $codedom = &Apache::lonnet::default_login_domain();
 
@@ -89,7 +90,7 @@ sub handler {
     if ($env{'form.coursenum'} ne '' && &user_is_known()) {
         &course_details($r,$codedom,$formname,$domdesc,\@trails,\%allitems);
     } else {
-        my ($catlinks,$has_subcats) = &category_breadcrumbs($codedom,@cats);
+        my ($catlinks,$has_subcats,$selitem) = &category_breadcrumbs($codedom,@cats);
         my $catjs = <<"ENDSCRIPT";
 
 function setCatDepth(depth) {
@@ -101,18 +102,18 @@ function setCatDepth(depth) {
     return;
 }
 
-ENDSCRIPT
-        if ($env{'form.state'} eq 'listing') {
-            $catjs .= qq|
 function changeSort(caller) {
     document.$formname.sortby.value = caller;
     document.$formname.submit();
 }
+
 function setCourseId(caller) {
     document.$formname.coursenum.value = caller;
     document.$formname.submit();
-}\n|;
-        }
+}
+
+ENDSCRIPT
+        $catjs .= &courselink_javascript(); 
         my $numtitles;
         if ($env{'form.currcat_0'} eq 'instcode::0') {
             $numtitles = &instcode_course_selector($r,$codedom,$formname,$domdesc,
@@ -122,13 +123,27 @@ function setCourseId(caller) {
             }
         } else {
             my (%add_entries);
+            my ($currdepth,$deeper) = &get_depth_values();
+            if ($selitem) {
+                my $alert = &mt('Choose a subcategory to display');
+                if (!$deeper) {
+                    $alert = &mt('Choose a category to display');
+                }
+                $catjs .= <<ENDJS;
+function check_selected() {
+    if (document.coursecats.$selitem.options[document.coursecats.$selitem.selectedIndex].value == "") {
+        alert('$alert');
+        return false;
+    }
+}
+ENDJS
+            }
             $catjs = '<script type="text/javascript">'."\n".$catjs."\n".'</script>';
             &cat_header($r,$codedom,$catjs,\%add_entries,$catlinks);
             if ($env{'form.currcat_0'} ne '') {
                 $r->print('<form name="'.$formname.
                           '" method="post" action="/adm/coursecatalog">'.
                           &additional_filters($codedom,$has_subcats)."\n");
-                my ($currdepth,$deeper) = &get_depth_values();
                 $r->print('<input type="hidden" name="catalog_maxdepth" value="'.
                           $deeper.'" />'."\n");
                 for (my $i=0; $i<$deeper; $i++) {
@@ -156,8 +171,10 @@ sub course_details {
     my $output;
     my %add_entries = (topmargin    => "0",
                        marginheight => "0",);
+    my $js = '<script type="text/javascript">'."\n".
+             &courselink_javascript().'</script>'."\n";
     my $start_page =
-        &Apache::loncommon::start_page('Course Catalog','',
+        &Apache::loncommon::start_page('Course Catalog',$js,
                                            {
                                              'add_entries' => \%add_entries,
                                              'no_inline_link'   => 1,});
@@ -173,16 +190,43 @@ sub course_details {
              {text=>"Course details"});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Details'));
     $r->print('<br />'.&mt('Detailed course information:').'<br /><br />'.
-              '<form name="'.$formname.'" method="post">'.
               &print_course_listing($codedom,undef,$trails,$allitems).
               '<br /><br />');
-    $r->print('<a href = "javascript:document.coursecatalog.submit()">'.
+    $r->print('<form name="'.$formname.'" method="post" action="/adm/coursecatalog">'.
+              '<a href = "javascript:document.coursecatalog.submit()">'.
               &mt('Back to course listing').'</a>'.
-              '<input type="hidden" name="sortby" value="'.
-              $env{'form.sortby'}.'" />'.
-              '<input type="hidden" name="state" value="listing" /></form>');
+              &Apache::lonhtmlcommon::echo_form_input(['coursenum','catalogfilter',
+                                                       'showdetails','courseid']).'</form>');
+    return;
+}
+
+sub courselink_javascript {
+    return <<"END";
+
+function ToSyllabus(cdom,cnum) {
+    if (cdom == '' || cdom == null) {
+        return;
+    }
+    if (cnum == '' || cnum == null) {
+        return;
+    }
+    document.linklaunch.action = "/public/"+cdom+"/"+cnum+"/syllabus";
+    document.linklaunch.submit();
+}
+
+function ToSelfenroll(courseid) {
+    if (courseid == '') {
+        return;
+    }
+    document.linklaunch.action = "/adm/selfenroll";
+    document.linklaunch.courseid.value = courseid;
+    document.linklaunch.submit();
 }
 
+END
+}
+
+
 sub instcode_course_selector {
     my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs) = @_;
     my %coursecodes = ();
@@ -319,11 +363,9 @@ function setElements() {
                   '<input type="submit" name="catalogfilter" value="'.
                   &mt('Display courses').'" />'.
                   '<input type="hidden" name="numtitles" value="'.$numtitles.
-                  '" /></form>');
-        if (($numtitles > 0) && ($env{'form.state'} eq 'listing')) {
-            $r->print('<br />');
-        }
+                  '" /></form><br /><br />');
     } else {
+        $js = '<script type"text/javascript">'."\n$catjs\n".'</script>';
         &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles);
         my $cat_maxdepth = $env{'form.catalog_maxdepth'};
         $r->print('<form name="'.$formname.'" method="post" action="/adm/coursecatalog">'.
@@ -360,49 +402,72 @@ sub cat_header {
           text=>"Select courses"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('Select courses'));
     }
+    my $onchange;
+    unless (($env{'browser.interface'} eq 'textual') || ($env{'form.interface'} eq 'textual')) {
+        $onchange = 'this.form.submit()';
+    }
     $r->print('<form name="coursecatdom" method="post" action="/adm/coursecatalog">'.
               '<table border="0"><tr><td><b>'.&mt('Domain:').'</b></td><td>'.
-              &Apache::loncommon::select_dom_form($codedom,'showdom','',1).
-	      '&nbsp;<input type="submit" name="godom" value="'.&mt('Change').'" /></td></tr></table></form>'.
-	      '<form name="coursecats" method="post" action="/adm/coursecatalog">'.
+              &Apache::loncommon::select_dom_form($codedom,'showdom','',1,$onchange));
+    if (!$onchange) {
+	   $r->print('&nbsp;<input type="submit" name="godom" value="'.&mt('Change').'" />');
+    }
+    $r->print('</td></tr></table></form>'.
+	      '<form name="coursecats" method="post" action="/adm/coursecatalog"'.
+              ' onsubmit="return check_selected();">'.
               '<table border="0"><tr>'.$catlinks.'</tr></table></form>');
     return;
 }
 
 sub category_breadcrumbs {
     my ($dom,@cats) = @_;
+    my $crumbsymbol = ' &#x25b6; ';
     my ($currdepth,$deeper) = &get_depth_values();
     my $currcat_str = '<input type="hidden" name="catalog_maxdepth" value="'.$deeper.'" /><input type="hidden" name="showdom" value="'.$dom.'" />';
     my $catlinks = '<td valign="top"><b>'.&mt('Catalog:').'</b></td><td><table><tr>';
     my $has_subcats;
+    my $selitem;
     for (my $i=0; $i<$deeper; $i++) {
         $currcat_str .= '<input type="hidden" name="currcat_'.$i.'" value="'.$env{'form.currcat_'.$i}.'" />';
         my ($cattitle,$shallower);
         if ($i == 0) {
-            $cattitle = &mt('Main Categories');
+            if (ref($cats[0]) eq 'ARRAY') {
+                if (@{$cats[0]} > 1) {
+                    $cattitle = &mt('Main Categories');
+                }
+            }
         } else {
             $shallower = $i-1;
             my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$env{'form.currcat_'.$shallower});
             $cattitle = $cat;
         }
-        $catlinks .= '<td valign="top"><a href="javascript:setCatDepth('."'$shallower'".')">'.$cattitle.'</a>-&gt;</td>';
+        if ($cattitle ne '') {
+            $catlinks .= '<td valign="top"><a href="javascript:setCatDepth('."'$shallower'".')">'.$cattitle.'</a>'.$crumbsymbol.'</td>';
+        }
     }
     if ($deeper == 0) {
-        $catlinks .= '<td>'.&mt('Main Categories').':&nbsp;';
+        $catlinks .= '<td>';
         if (ref($cats[0]) eq 'ARRAY') {
-            if ((@{$cats[0]} == 1) && ($cats[0][0] eq 'instcode')) {
-                $catlinks .= &mt('Official courses (with institutional codes)').
-                             '<input type="hidden" name="currcat_0" value="instcode::0" />';
-                $env{'form.currcat_0'} = 'instcode::0';
+            if ((@{$cats[0]} == 1) && (@cats == 1)) {
+                if ($cats[0][0] eq 'instcode') {
+                    $catlinks .= &mt('Official courses (with institutional codes)').
+                                 '<input type="hidden" name="currcat_0" value="instcode::0" />';
+                    $env{'form.currcat_0'} = 'instcode::0';
+                } else {
+                    my $name = $cats[0][0];
+                    my $item = &escape($name).'::0';
+                    $catlinks .= $name.
+                             '<input type="hidden" name="currcat_0" value="'.$item.'" />';
+                    $env{'form.currcat_0'} = $item;
+                }
             } else {
                 $has_subcats = 1;
-                $catlinks .= '<select name="currcat_0">'."\n";
+                my $buttontext = &mt('Show subcategories');
+                $selitem = 'currcat_0';
+                $catlinks .= '<select name="'.$selitem.'">'."\n";
                 if (@{$cats[0]} > 1) {
-                    my $selstr;
-                    if ($env{'form.currcat_0'} eq '') {
-                        $selstr = ' selected="selected" ';
-                    }
-                    $catlinks .= '<option value=""  selected="selected">'.&mt('Select').'</option>'."\n";
+                    $catlinks .= '<option value="" selected="selected">'.&mt('Select').'</option>'."\n";
+                    $buttontext = &mt('Pick main category');
                 }
                 for (my $i=0; $i<@{$cats[0]}; $i++) {
                     my $name = $cats[0][$i];
@@ -416,7 +481,8 @@ sub category_breadcrumbs {
                     $catlinks .= '</option>'."\n";
                 }
                 $catlinks .= '</select>'."\n".
-                             '&nbsp;<input type="submit" name="gocats" value="'.&mt('Change').'" />';
+                             '&nbsp;<input type="submit" name="gocats" value="'.
+                             $buttontext.'" />';
             }
         } else {
             $catlinks .= &mt('Official courses (with institutional codes)').
@@ -436,24 +502,31 @@ sub category_breadcrumbs {
         if ($cat eq 'instcode') {
             $currcat = &mt('Official courses (with institutional codes)');
         }
-        $catlinks .= '<td>'.$currcat;
+        $catlinks .= '<td><b>'.$currcat.'</b>';
         if (ref($cats[$deeper]{$cat}) eq 'ARRAY') {
             $has_subcats = 1;
-            my $selstr;
-            $catlinks .= ':&nbsp;<select name="currcat_'.$deeper.'">'.
-                         '<option value="" selected="selected">'.
-                         &mt('Select').'</option>';
+            my $buttontext = &mt('Show subcategories');
+            $selitem = 'currcat_'.$deeper;
+            $catlinks .= ':&nbsp;<select name="'.$selitem.'">';
+            if (@{$cats[$deeper]{$cat}} > 1) {
+                $catlinks .= '<option value="" selected="selected">'.
+                             &mt('Select').'</option>';
+                $buttontext = &mt('Pick subcategory');
+            }
             for (my $k=0; $k<@{$cats[$deeper]{$cat}}; $k++) {
                 my $name = $cats[$deeper]{$cat}[$k];
                 my $item = &escape($name).':'.&escape($cat).':'.$deeper;
                 $catlinks .= '<option value="'.$item.'">'.$name.'</option>'."\n";
             }
             $catlinks .= '</select>'."\n".
-                         '&nbsp;<input type="submit" name="gocats" value="'.&mt('Change').'" />';
+                         '&nbsp;<input type="submit" name="gocats" value="'.
+                         $buttontext.'" />';
+        } elsif ($cat ne 'instcode') {
+            $catlinks .= '&nbsp;'.&mt('(No subcategories)');
         }
     }
     $catlinks .= $currcat_str.'</td></tr></table></td>';
-    return ($catlinks,$has_subcats);
+    return ($catlinks,$has_subcats,$selitem);
 }
 
 sub get_depth_values {
@@ -492,8 +565,8 @@ sub additional_filters {
             $output .= '<tr><td><label>'.
                        '<input type="checkbox" name="withsubcats" value="1" '.
                        $include_subcat_status.'/>'.
-                       &mt('Include subcategories within "[_1]"',$catname).
-                       '</label></td></tr>';
+                       &mt('Include subcategories within "[_1]"',
+                           &unescape($catname)).'</label></td></tr>';
         }
     }
     my $show_selfenroll_status;
@@ -738,9 +811,10 @@ sub print_course_listing {
     my %domconfig =
         &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
     $output .= &construct_data_table($knownuser,\%courses,$details,undef,$now,\%domconfig,$trails,$allitems);
-    if ($env{'form.coursenum'} ne '') {
-        $output .= &Apache::lonhtmlcommon::echo_form_input(['coursenum','state','catalogfilter','sortby','showdetails']);
-    }
+    $output .= "\n".'<form name="linklaunch" method="post" action="">'.
+               '<input type="hidden" name="backto" value="coursecatalog" />'.
+               '<input type="hidden" name="courseid" value="" />'.
+               &Apache::lonhtmlcommon::echo_form_input(['catalogfilter','courseid']).'</form>';
     return $output;
 }
 
@@ -782,7 +856,7 @@ sub construct_data_table {
             $output .=
               '<th>'.&mt('Default Access Dates for Students').'</th>'.
               '<th>'.&mt('Student Counts').'</th>'.
-              '<th>'.&mt('Auto-enrollment of <br />registered students').'</th>';
+              '<th>'.&mt('Auto-enrollment of[_1]registered students','<br />').'</th>';
         } else {
             $output .= '<th>'.&mt('Details').'</th>';
         }
@@ -841,7 +915,7 @@ sub build_courseinfo_hash {
         $cleandesc=~s/'/\\'/g;
         $cleandesc =~ s/^\s+//;
         my ($cdom,$cnum)=split(/\_/,$course);
-        my ($descr,$instcode,$singleowner,$ttype,$selfenroll_types,
+        my ($instcode,$singleowner,$ttype,$selfenroll_types,
             $selfenroll_start,$selfenroll_end,@owners,%ownernames,$categories);
         if (ref($courses->{$course}) eq 'HASH') {
             $descr = $courses->{$course}{'description'};
@@ -929,10 +1003,10 @@ sub build_courseinfo_hash {
                 }
             }
             if ($startaccess) {
-                $accessdates .= &mt('<i>From:</i> ').$startaccess.'<br />';
+                $accessdates .= '<i>'.&mt('From:[_1]','</i> '.$startaccess).'<br />';
             }
             if ($endaccess) {
-                $accessdates .= &mt('<i>To:</i> ').$endaccess.'<br />';
+                $accessdates .= '<i>'.&mt('To:[_1]','</i> '.$endaccess).'<br />';
             }
             if (($selfenroll_types ne '') && 
                 ($selfenroll_end > 0 && $selfenroll_end > $now)) {
@@ -953,10 +1027,10 @@ sub build_courseinfo_hash {
                     if ($selfenroll_start_access || $selfenroll_end_access) {
                         $accessdates .= '<br/><br /><i>'.&mt('Self-enrollers:').'</i><br />';
                         if ($selfenroll_start_access) {
-                            $accessdates .= &mt('<i>From:</i> ').$selfenroll_start_access.'<br />';
+                            $accessdates .= '<i>'.&mt('From:[_1]','</i> '.$selfenroll_start_access).'<br />';
                         }
                         if ($selfenroll_end_access) {
-                            $accessdates .= &mt('<i>To:</i> ').$selfenroll_end_access.'<br />';
+                            $accessdates .= '<i>'.&mt('To:[_1]','</i> '.$selfenroll_end_access).'<br />';
                         }
                     }
                 }
@@ -991,10 +1065,10 @@ sub count_students {
         $student_count{$data->[$idx{'status'}]} ++;
     }
 
-    my $countslist = &mt('[quant,_1,section]',$numsec).':<br />';
+    my $countslist = &mt('[quant,_1,section:,sections:,No sections]',$numsec).'<br />';
     foreach my $status ('Active','Future') {
-        $countslist .= '<nobr>'.$status_title{$status}.': '.
-                       $student_count{$status}.'</nobr><br />';
+        $countslist .= '<span class="LC_nobreak">'.$status_title{$status}.': '.
+                       $student_count{$status}.'</span><br />';
     }
     return $countslist;
 }
@@ -1043,7 +1117,7 @@ sub courseinfo_row {
                '<td>'.$xlist_items.'</td>'.
                '<td>'.$title.'&nbsp;<font size="-2">';
     if ($showsyllabus) {
-        $output .= &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$cnum,$cdom);
+        $output .= '<a href="javascript:ToSyllabus('."'$cdom','$cnum'".')">'.&mt('Syllabus').'</a>';
     } else {
         $output .= '&nbsp;';
     }
@@ -1067,7 +1141,7 @@ sub courseinfo_row {
             if (($info->{'selfenroll_start'} > 0) && ($info->{'selfenroll_start'} > $now)) {
                 $output .= '<td>'.&mt('Starts: [_1]','<span class="LC_cusr_emph">'.$showstart.'</span>').'<br />'.&mt('Ends: [_1]','<span class="LC_cusr_emph">'.$showend.'</span>').'</td>';
             } else { 
-                $output .= '<td><a href="/adm/selfenroll?cid='.$course.'">'.&mt('Enroll in course').'</a></td>';
+                $output .= '<td><a href="javascript:ToSelfenroll('."'$course'".')">'.&mt('Enroll in course').'</a></td>';
             }
             $selfenroll = 1;
         }
@@ -1097,7 +1171,7 @@ sub identify_sections {
         }
     }
     @secnums = sort {$a <=> $b} @secnums;
-    my $seclist = join(', ',@secnums);
+    $seclist = join(', ',@secnums);
     my $numsec = @secnums;
     return ($seclist,$numsec);
 }
@@ -1134,11 +1208,11 @@ sub get_valid_classes {
     }
     if ($totalitems > 0) {
         if (@{$validations{'sections'}}) {
-            $response = &mt('Sections: ').
+            $response = &mt('Sections:').' '.
                         join(', ',@{$validations{'sections'}}).'<br />';
         }
         if (@{$validations{'xlists'}}) {
-            $response .= &mt('Courses: ').
+            $response .= &mt('Courses:').' '.
                         join(', ',@{$validations{'xlists'}});
         }
     }
@@ -1303,17 +1377,20 @@ sub autoenroll_info {
                    &get_valid_classes($seclist,$xlist_items,$code,
                                       $owners,$cdom,$cnum);
                 if ($valid_classes ne '') {
-                    $autoenrolldates = &mt('Not enabled<br />Starts: ').
-                                       $autostart.'<br />'.$valid_classes;                }
+                    $autoenrolldates = &mt('Not enabled').'<br />'
+                                      .&mt('Starts: [_1]',$autostart)
+                                      .'<br />'.$valid_classes;
+                }
             }
         } else {
             if ($coursehash->{'internal.autoend'} && $coursehash->{'internal.autoend'} < $now) {
-                $autoenrolldates = &mt('Not enabled<br />Ended: ').$autoend;
+                $autoenrolldates = &mt('Not enabled').'<br />'
+                                  .&mt('Ended: [_1]',$autoend);
             } else {
                 my $valid_classes = &get_valid_classes($seclist,$xlist_items,
                                                        $code,$owners,$cdom,$cnum);
                 if ($valid_classes ne '') {
-                    $autoenrolldates = &mt('Currently enabled<br />').
+                    $autoenrolldates = &mt('Currently enabled').'<br />'.
                                        $valid_classes;
                 }
             }