--- loncom/interface/coursecatalog.pm	2008/09/23 20:31:09	1.44
+++ loncom/interface/coursecatalog.pm	2009/03/18 20:58:02	1.50
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler for displaying the course catalog interface
 #
-# $Id: coursecatalog.pm,v 1.44 2008/09/23 20:31:09 raeburn Exp $
+# $Id: coursecatalog.pm,v 1.50 2009/03/18 20:58:02 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -90,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) {
@@ -123,13 +123,27 @@ ENDSCRIPT
             }
         } 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++) {
@@ -351,6 +365,7 @@ function setElements() {
                   '<input type="hidden" name="numtitles" value="'.$numtitles.
                   '" /></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">'.
@@ -365,7 +380,7 @@ function setElements() {
 sub cat_header {
     my ($r,$codedom,$js,$add_entries,$catlinks,$numtitles) = @_;
     my $start_page =
-        &Apache::loncommon::start_page('Course Catalog',$js,
+        &Apache::loncommon::start_page('Other',$js,
                                        {
                                          'add_entries' => $add_entries,
                                          'no_inline_link'   => 1,});
@@ -387,11 +402,19 @@ 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 = 1;
+    }
     $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;
 }
@@ -403,34 +426,48 @@ sub category_breadcrumbs {
     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>'.$crumbsymbol.'</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];
@@ -444,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)').
@@ -464,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 {