--- loncom/interface/loncommon.pm	2010/03/29 13:40:03	1.963
+++ loncom/interface/loncommon.pm	2010/08/16 16:02:08	1.977
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.963 2010/03/29 13:40:03 raeburn Exp $
+# $Id: loncommon.pm,v 1.977 2010/08/16 16:02:08 bisitz Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -900,7 +900,7 @@ sub select_language {
             $langchoices{$code} = &plainlanguagedescription($id);
         }
     }
-    return &select_form($selected,$name,%langchoices);
+    return &select_form($selected,$name,\%langchoices);
 }
 
 =pod
@@ -1072,7 +1072,7 @@ END
 
 =pod
 
-=item * &help_open_topic($topic,$text,$stayOnPage,$width,$height)
+=item * &help_open_topic($topic,$text,$stayOnPage,$width,$height,$imgid)
 
 Returns a string corresponding to an HTML link to the given help
 $topic, where $topic corresponds to the name of a .tex file in
@@ -1090,12 +1090,16 @@ a new window using Javascript. (Default
 
 $width and $height are optional numerical parameters that will
 override the width and height of the popped up window, which may
-be useful for certain help topics with big pictures included. 
+be useful for certain help topics with big pictures included.
+
+$imgid is the id of the img tag used for the help icon. This may be
+used in a javascript call to switch the image src.  See 
+lonhtmlcommon::htmlareaselectactive() for an example.
 
 =cut
 
 sub help_open_topic {
-    my ($topic, $text, $stayOnPage, $width, $height) = @_;
+    my ($topic, $text, $stayOnPage, $width, $height, $imgid) = @_;
     $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);
     $width = 350 if (not defined $width);
@@ -1124,10 +1128,13 @@ sub help_open_topic {
     # (Always) Add the graphic
     my $title = &mt('Online Help');
     my $helpicon=&lonhttpdurl("/adm/help/help.png");
+    if ($imgid ne '') {
+        $imgid = ' id="'.$imgid.'"';
+    }
     $template.=' <a target="_top" href="'.$link.'" title="'.$title.'">'
               .'<img src="'.$helpicon.'" border="0"'
               .' alt="'.&mt('Help: [_1]',$topic).'"'
-              .' title="'.$title.'" style="vertical-align:middle;"' 
+              .' title="'.$title.'" style="vertical-align:middle;"'.$imgid 
               .' /></a>';
     if ($text ne "") {	
         $template.='</span>';
@@ -1786,7 +1793,7 @@ sub domain_select {
 	return &multiple_select_form($name,$value,4,\%domains);
     } else {
 	$domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];
-	return &select_form($name,$value,%domains);
+	return &select_form($name,$value,\%domains);
     }
 }
 
@@ -1848,29 +1855,36 @@ sub multiple_select_form {
 
 =pod
 
-=item * &select_form($defdom,$name,%hash)
+=item * &select_form($defdom,$name,$hashref,$onchange)
 
 Returns a string containing a <select name='$name' size='1'> form to 
-allow a user to select options from a hash option_name => displayed text.  
+allow a user to select options from a ref to a hash containing:
+option_name => displayed text. An optional $onchange can include
+a javascript onchange item, e.g., onchange="this.form.submit();"  
+
 See lonrights.pm for an example invocation and use.
 
 =cut
 
 #-------------------------------------------
 sub select_form {
-    my ($def,$name,%hash) = @_;
-    my $selectform = "<select name=\"$name\" size=\"1\">\n";
+    my ($def,$name,$hashref,$onchange) = @_;
+    return unless (ref($hashref) eq 'HASH');
+    if ($onchange) {
+        $onchange = ' onchange="'.$onchange.'"';
+    }
+    my $selectform = "<select name=\"$name\" size=\"1\"$onchange>\n";
     my @keys;
-    if (exists($hash{'select_form_order'})) {
-	@keys=@{$hash{'select_form_order'}};
+    if (exists($hashref->{'select_form_order'})) {
+	@keys=@{$hashref->{'select_form_order'}};
     } else {
-	@keys=sort(keys(%hash));
+	@keys=sort(keys(%{$hashref}));
     }
     foreach my $key (@keys) {
         $selectform.=
 	    '<option value="'.&HTML::Entities::encode($key,'"<>&').'" '.
             ($key eq $def ? 'selected="selected" ' : '').
-                ">".$hash{$key}."</option>\n";
+                ">".$hashref->{$key}."</option>\n";
     }
     $selectform.="</select>";
     return $selectform;
@@ -1888,9 +1902,9 @@ sub display_filter {
            &mt('Filter [_1]',
 	   &select_form($env{'form.displayfilter'},
 			'displayfilter',
-			('currentfolder' => 'Current folder/page',
+			{'currentfolder' => 'Current folder/page',
 			 'containing' => 'Containing phrase',
-			 'none' => 'None'))).
+			 'none' => 'None'})).
 			 '<input type="text" name="containingphrase" size="30" value="'.&HTML::Entities::encode($env{'form.containingphrase'}).'" /></span>';
 }
 
@@ -3232,8 +3246,7 @@ sub filemimetype {
 sub filecategoryselect {
     my ($name,$value)=@_;
     return &select_form($value,$name,
-			'' => &mt('Any category'),
-			map { $_,$_ } sort(keys(%category_extensions)));
+                        {'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))});
 }
 
 =pod
@@ -4598,8 +4611,6 @@ sub bodytag {
     }
 
     if (!$realm) { $realm='&nbsp;'; }
-# Set messages
-    my $messages=&domainlogo($domain);
 
     my $extra_body_attr = &make_attr_string($forcereg,\%design);
 
@@ -4793,10 +4804,6 @@ sub standard_css {
     my $vlink  = &designparm($function.'.vlink', $domain);
     my $link   = &designparm($function.'.link',  $domain);
 
-    my $loginbg = &designparm('login.sidebg',$domain);
-    my $bgcol = &designparm('login.bgcol',$domain);
-    my $textcol = &designparm('login.textcol',$domain);
-
     my $sans                 = 'Verdana,Arial,Helvetica,sans-serif';
     my $mono                 = 'monospace';
     my $data_table_head      = $sidebg;
@@ -5059,6 +5066,7 @@ td.LC_table_cell_checkbox {
   background: #F8F8F8; /* $sidebg; */
   border: 1px solid $sidebg;
   margin: 0 0 10px 0;      
+  padding: 3px;
 }
 
 .LC_fontsize_medium {
@@ -5425,6 +5433,14 @@ span.LC_parm_symb {
   color: #AAAAAA;
 }
 
+ul.LC_parm_parmlist li {
+  display: inline-block;
+  padding: 0.3em 0.8em;
+  vertical-align: top;
+  width: 150px;
+  border-top:1px solid $lg_border_color;
+}
+
 td.LC_parm_overview_level_menu,
 td.LC_parm_overview_map_menu,
 td.LC_parm_overview_parm_selectors,
@@ -5585,16 +5601,6 @@ table.LC_group_priv td {
   padding: 0;
 }
 
-table.LC_notify_front_page {
-  background: white;
-  border: 1px solid black;
-  padding: 8px;
-}
-
-table.LC_notify_front_page td {
-  padding: 8px;
-}
-
 .LC_navbuttons {
   margin: 2ex 0ex 2ex 0ex;
 }
@@ -6028,7 +6034,7 @@ fieldset > legend {
 
 #LC_nav_bar {
   float: left;
-  margin: 0;
+  margin: 0 0 2px 0;
 }
 
 #LC_realm {
@@ -6043,6 +6049,11 @@ fieldset > legend {
   font-style: normal;
 }
 
+/* Preliminary fix to hide nav_bar inside bookmarks window */
+#LC_bookmarks #LC_nav_bar {
+  display:none;
+}
+
 ol.LC_primary_menu {
   float: right;
   margin: 0;
@@ -6073,6 +6084,30 @@ ol.LC_primary_menu a.LC_new_message {
   color: darkred;
 }
 
+ol.LC_docs_parameters {
+  margin-left: 0;
+  padding: 0;
+  list-style: none;
+}
+
+ol.LC_docs_parameters li {
+  margin: 0;
+  padding-right: 20px;
+  display: inline;
+}
+
+ol.LC_docs_parameters li:before {
+  content: "\\002022 \\0020";
+}
+
+li.LC_docs_parameters_title {
+  font-weight: bold;
+}
+
+ol.LC_docs_parameters li.LC_docs_parameters_title:before {
+  content: "";
+}
+
 ul#LC_secondary_menu {
   clear: both;
   color: $fontmenu;
@@ -6247,6 +6282,14 @@ ul.LC_CourseBreadcrumbs li a {
   font-size:90%;
 }
 
+ol#LC_MenuBreadcrumbs h1 {
+  display: inline;
+  font-size: 90%;
+  line-height: 2.5em;
+  margin: 0;
+  padding: 0;
+}
+
 ol#LC_PathBreadcrumbs li a {
   text-decoration:none;
   font-size:100%;
@@ -6343,52 +6386,6 @@ div.LC_columnSection>* {
   overflow:hidden;
 }
 
-.LC_loginpage_container {
-  text-align:left;
-  margin : 0 auto;
-  width:90%;
-  padding: 10px;
-  height: auto;
-  background-color:#FFFFFF;
-  border:1px solid #CCCCCC;
-}
-
-
-.LC_loginpage_loginContainer {
-  float:left;
-  width: 182px;
-  padding: 2px;
-  border:1px solid #CCCCCC;
-  background-color:$loginbg;
-}
-
-.LC_loginpage_loginContainer h2 {
-  margin-top: 0;
-  display:block;
-  background:$bgcol;
-  color:$textcol;
-  padding-left:5px;
-}
-
-.LC_loginpage_loginInfo {
-  float:left;
-  width:182px;
-  border:1px solid #CCCCCC;
-  padding:2px;
-}
-
-.LC_loginpage_space {
-  clear: both;
-  margin-bottom: 20px;
-  border-bottom: 1px solid #CCCCCC;
-}
-
-.LC_loginpage_floatLeft {
-  float: left;
-  width: 200px;
-  margin: 0;
-}
-
 table em {
   font-weight: bold;
   font-style: normal;
@@ -6514,6 +6511,10 @@ ul.LC_funclist li {
   padding: 0px 4px
 }
 
+.LC_hidden {
+  display: none;
+}
+
 END
 }
 
@@ -6627,10 +6628,6 @@ Inputs: none
 sub xml_begin {
     my $output='';
 
-    if ($env{'internal.start_page'}==1) {
-	&Apache::lonhtmlcommon::init_htmlareafields();
-    }
-
     if ($env{'browser.mathml'}) {
 	$output='<?xml version="1.0"?>'
             #.'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'."\n"
@@ -6702,6 +6699,14 @@ $args - additional optional args support
 sub start_page {
     my ($title,$head_extra,$args) = @_;
     #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));
+#SD
+#I don't see why we copy certain elements of %$args to %head_args
+#head args is passed to headtag() and this routine only reads those
+#keys that are needed. There doesn't happen any writes or any processing
+#of other keys.
+#proposal: just pass $args to headtag instead of \%head_args and delete 
+#marked lines
+#<- MARK
     my %head_args;
     foreach my $arg ('redirect','force_register','domain','function',
 		     'bgcolor','frameset','no_nav_bar','only_body',
@@ -6710,13 +6715,16 @@ sub start_page {
 	    $head_args{$arg} = $args->{$arg};
 	}
     }
+#MARK ->
 
     $env{'internal.start_page'}++;
     my $result;
+
     if (! exists($args->{'skip_phases'}{'head'}) ) {
-	$result.=
-	    &xml_begin().
-        &headtag($title,$head_extra,\%head_args);
+        $result .= 
+                  &xml_begin() . &headtag($title,$head_extra,\%head_args);
+#replace prev line by
+#                 &xml_begin() . &headtag($title, $head_extra, $args);
     }
     
     if (! exists($args->{'skip_phases'}{'body'}) ) {
@@ -6746,15 +6754,10 @@ sub start_page {
     #            $result .= &build_functionlist();
     #}
 
-    # Don't add anything more if only_body wanted
-    return $result if $args->{'only_body'};
+    # Don't add anything more if only_body wanted or in const space
+    return $result if    $args->{'only_body'} 
+                      || $env{'request.state'} eq 'construct';
 
-    #Breadcrumbs for Construction Space provided by &bodytag. 
-    if (
-        $env{'request.state'} eq 'construct') {
-        return $result;
-    }
- 
     #Breadcrumbs
     if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) {
 		&Apache::lonhtmlcommon::clear_breadcrumbs();
@@ -6888,18 +6891,20 @@ sub simple_error_page {
     }
 
     sub start_data_table_row {
-	my ($add_class) = @_;
+	my ($add_class, $id) = @_;
 	$row_count[0]++;
 	my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';
 	$css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
-	return  '<tr class="'.$css_class.'">'."\n";;
+        $id = (' id="'.$id.'"') unless ($id eq '');
+        return  '<tr class="'.$css_class.'"'.$id.'>'."\n";
     }
     
     sub continue_data_table_row {
-	my ($add_class) = @_;
+	my ($add_class, $id) = @_;
 	my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';
-	$css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');;
-	return  '<tr class="'.$css_class.'">'."\n";;
+	$css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
+        $id = (' id="'.$id.'"') unless ($id eq '');
+        return  '<tr class="'.$css_class.'"'.$id.'>'."\n";
     }
 
     sub end_data_table_row {
@@ -8101,6 +8106,10 @@ sub get_institutional_codes {
     return;
 }
 
+sub get_standard_codeitems {
+    return ('Year','Semester','Department','Number','Section');
+}
+
 =pod
 
 =head1 Slot Helpers