--- loncom/interface/loncommon.pm	2009/05/16 18:06:41	1.819
+++ loncom/interface/loncommon.pm	2009/05/28 16:54:29	1.832
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.819 2009/05/16 18:06:41 tempelho Exp $
+# $Id: loncommon.pm,v 1.832 2009/05/28 16:54:29 bisitz Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -407,6 +407,7 @@ sub studentbrowser_javascript {
           ) { return ''; }  
    return (<<'ENDSTDBRW');
 <script type="text/javascript" language="Javascript">
+// <![CDATA[
     var stdeditbrowser;
     function openstdbrowser(formname,uname,udom,roleflag,ignorefilter,courseadvonly) {
         var url = '/adm/pickstudent?';
@@ -429,6 +430,7 @@ sub studentbrowser_javascript {
         stdeditbrowser = open(url,title,options,'1');
         stdeditbrowser.focus();
     }
+// ]]>
 </script>
 ENDSTDBRW
 }
@@ -461,6 +463,7 @@ sub selectstudent_link {
 sub authorbrowser_javascript {
     return <<"ENDAUTHORBRW";
 <script type="text/javascript" language="JavaScript">
+// <![CDATA[
 var stdeditbrowser;
 
 function openauthorbrowser(formname,udom) {
@@ -473,6 +476,7 @@ function openauthorbrowser(formname,udom
     stdeditbrowser.focus();
 }
 
+// ]]>
 </script>
 ENDAUTHORBRW
 }
@@ -482,6 +486,7 @@ sub coursebrowser_javascript {
     my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Group - for which you wish to add/modify a user role');
    my $output = '
 <script type="text/javascript" language="JavaScript">
+// <![CDATA[
     var stdeditbrowser;'."\n";
    $output .= <<"ENDSTDBRW";
     function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) {
@@ -568,6 +573,7 @@ ENDSTDBRW
         $output .= &setsec_javascript($sec_element,$formname);
     }
     $output .= '
+// ]]>
 </script>';
     return $output;
 }
@@ -829,6 +835,7 @@ sub linked_select_forms {
     # output the javascript to do the changing
     my $result = '';
     $result.='<script type="text/javascript" language="JavaScript">'."\n";
+    $result.="// <![CDATA[\n";
     $result.="var select2data = new Object();\n";
     $" = '","';
     my $debug = '';
@@ -874,6 +881,7 @@ function select1_changed() {
         }
     }
 }
+// ]]>
 </script>
 END
     # output the initial values for the selection lists
@@ -1027,7 +1035,9 @@ sub update_help_link {
     my $banner_link = "/adm/helpmenu?page=banner&amp;topic=$topic&amp;component_help=$component_help&amp;faq=$faq&amp;bug=$bug&amp;origurl=$origurl&amp;stamp=$timestamp&amp;stayonpage=$stayOnPage";
     my $output .= <<"ENDOUTPUT";
 <script type="text/javascript">
+// <![CDATA[
 banner_link = '$banner_link';
+// ]]>
 </script>
 ENDOUTPUT
     return $output;
@@ -1394,6 +1404,7 @@ sub resize_textarea_js {
     my $geometry = &viewport_geometry_js();
     return <<"RESIZE";
     <script type="text/javascript">
+// <![CDATA[
 $geometry
 
 function getX(element) {
@@ -1432,6 +1443,7 @@ function resize_textarea(textarea_id,bot
     }
     textarea.style.height=new_height+'px';
 }
+// ]]>
 </script>
 RESIZE
 
@@ -2299,7 +2311,7 @@ sub authform_internal{
     $result = &mt
         ('[_1] Internally authenticated (with initial password [_2])',
          '<label>'.$authtype,'</label>'.$autharg);
-    $result.="<label><input type=\"checkbox\" name=\"visible\" onClick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';
+    $result.="<label><input type=\"checkbox\" name=\"visible\" onclick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';
     return $result;
 }
 
@@ -4168,6 +4180,96 @@ sub designparm {
     return $output;
 }
 
+##############################################
+=pod
+
+=item * &authorspace()
+
+Inputs: ./.
+
+Returns: Path to the Construction Space of the current user's
+         accessed author space
+         The author space will be that of the current user
+         when accessing the own author space
+         and that of the co-author/assistent co-author
+         when accessing the co-author's/assistent co-author's
+         space
+
+=cut
+
+sub authorspace {
+    my $caname = '';
+    if ($env{'request.role'} =~ /^ca|^aa/) {
+        (undef,$caname) =
+            ($env{'request.role'}=~/($match_domain)\/($match_username)$/);
+    } else {
+        $caname = $env{'user.name'};
+    }
+    return '/priv/'.$caname.'/';
+}
+
+##############################################
+=pod
+
+=item * &head_subbox()
+
+Inputs: $content (contains HTML code with page functions, etc.)
+
+Returns: HTML div with $content
+         To be included in page header
+
+=cut
+
+sub head_subbox {
+    my ($content)=@_;
+    my $output =
+        '<div id="LC_head_subbox2">' #FIXME: solve conflicts with lonhtmlcommon:breadcrumbs LC_head_subbox
+       .$content
+       .'</div>'
+}
+
+##############################################
+=pod
+
+=item * &CSTR_pageheader()
+
+Inputs: ./.
+
+Returns: HTML div with CSTR path and recent box
+         To be included on Construction Space pages
+
+=cut
+
+sub CSTR_pageheader {
+    # this is for resources; directories have customtitle, and crumbs
+            # and select recent are created in lonpubdir.pm  
+    my ($uname,$thisdisfn)=
+        ($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|);
+    my $formaction='/priv/'.$uname.'/'.$thisdisfn;
+    $formaction=~s/\/+/\//g;
+
+    my $parentpath = '';
+    my $lastitem = '';
+    if ($thisdisfn =~ m-(.+/)([^/]*)$-) {
+        $parentpath = $1;
+        $lastitem = $2;
+    } else {
+        $lastitem = $thisdisfn;
+    }
+    return
+         '<div>'
+        .&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it?
+        .'<b>'.&mt('Construction Space:').'</b> '
+        .'<form name="dirs" method="post" action="'.$formaction
+        .'" target="_top"><tt><b>' #FIXME lonpubdir: target="_parent"
+        .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."$lastitem</b></tt><br />"
+        #FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />"
+        .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')
+        .'</form>'
+        .&Apache::lonmenu::constspaceform()
+        .'</div>';
+}
+
 ###############################################
 ###############################################
 
@@ -4200,10 +4302,6 @@ Inputs:
 =item * $forcereg, if page should register as content page (relevant for 
             text interface only)
 
-=item * $customtitle, alternate text to use instead of $title
-                      in the title box that appears, this text
-                      is not auto translated like the $title is
-
 =item * $no_nav_bar, if true, keep the 'what is this' info but remove the
                      navigational links
 
@@ -4228,7 +4326,7 @@ other decorations will be returned.
 =cut
 
 sub bodytag {
-    my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle,
+    my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,
         $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_;
 
     if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }
@@ -4299,9 +4397,6 @@ $realm&nbsp;
 ENDROLE
 
     my $titleinfo = '<h1>'.$title.'</h1>';
-    if ($customtitle) {
-        $titleinfo = $customtitle;
-    }
     #
     # Extra info if you are the DC
     my $dc_info = '';
@@ -4320,32 +4415,9 @@ ENDROLE
 	    $forcereg=1;
 	}
 
-	if (!$customtitle && $env{'request.state'} eq 'construct') {
-	    # this is for resources; directories have customtitle, and crumbs
-            # and select recent are created in lonpubdir.pm  
-	    my ($uname,$thisdisfn)=
-		($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|);
-	    my $formaction='/priv/'.$uname.'/'.$thisdisfn;
-	    $formaction=~s/\/+/\//g;
-
-	    my $parentpath = '';
-	    my $lastitem = '';
-	    if ($thisdisfn =~ m-(.+/)([^/]*)$-) {
-		$parentpath = $1;
-		$lastitem = $2;
-	    } else {
-		$lastitem = $thisdisfn;
-	    }
-	    $titleinfo = 
-		&Apache::loncommon::help_open_menu('','',3,'Authoring')
-		.'<b>'.&mt('Construction Space').'</b>:&nbsp;'
-		.'<form name="dirs" method="post" action="'.$formaction
-		.'" target="_top"><tt><b>'
-		.&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."<span class=\"LC_fontsize_big\">$lastitem</span></b></tt><br />"
-		.&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')
-		.'</form>'
-		.&Apache::lonmenu::constspaceform();
-        }
+    if ($env{'request.state'} eq 'construct') {
+        $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls
+    }
 
         my $titletable = '<table id="LC_title_bar">'
                         ."<tr><td> $titleinfo $dc_info</td>".$roleinfo
@@ -4629,7 +4701,6 @@ div.LC_confirm_box .LC_success img {
 
 .LC_disc_action_links_bar {
    background: $tabbg;
-   font-family: $sans;
    border: none;
    margin: 4px;
 }
@@ -4687,7 +4758,6 @@ table#LC_title_bar.LC_with_remote {
   border-width: $border;
   background: $pgbg;
   color: $fontmenu;
-  font-family: $sans;
   border-collapse: collapse;
   padding: 0;
   margin: 0;
@@ -4697,7 +4767,6 @@ table.LC_docs_path {
   width: 100%;
   border: 0;
   background: $pgbg;
-  font-family: $sans;
   border-collapse: collapse;
   padding: 0;
 }
@@ -4709,7 +4778,7 @@ table#LC_title_bar td {
 table#LC_title_bar .LC_title_bar_who {
   background: $tabbg;
   color: $fontmenu;
-  font: small $sans;
+  font: small;
   text-align: right;
   margin: 0;
 }
@@ -4726,10 +4795,6 @@ table#LC_title_bar div.LC_title_bar_real
   margin: 0;
 }
 
-span.LC_metadata {
-  font-family: $sans;
-}
-
 table#LC_menubuttons img{
   border: none;
 }
@@ -4745,7 +4810,6 @@ table#LC_top_nav td {
 table#LC_top_nav td a,
 div#LC_top_nav a {
   color: $font;
-  font-family: $sans;
 }
 
 table#LC_top_nav td.LC_top_nav_logo {
@@ -4774,7 +4838,6 @@ table.LC_breadcrumbs td,
 table.LC_docs_path td  {
   background: $tabbg;
   color: $fontmenu;
-  font-family: $sans;
   font-size: smaller;
 }
 
@@ -4782,7 +4845,6 @@ table.LC_breadcrumbs td.LC_breadcrumbs_c
 table.LC_docs_path td.LC_docs_path_component {
   background: $tabbg;
   color: $fontmenu;
-  font-family: $sans;
   font-size: larger;
   text-align: right;
 }
@@ -4802,13 +4864,21 @@ table#LC_mainmenu td.LC_mainmenu_column
 #LC_head_subbox {
  clear:both;
  background: $sidebg;
- border-bottom: 1px solid #999999;
+ border-bottom: 1px solid $lg_border_color;
  height: 32px;
  line-height: 32px; 
- margin: 0 0 10px;
+ margin: 0;
  padding: 0;
 }
 
+#LC_head_subbox2 { /* FIXME: replace by LC_head_subbox once lonhtmlcommon::breadcrumbs has been fixed */
+ clear:both;
+ background: #F8F8F8; /* $sidebg; */
+ border-bottom: 1px solid $lg_border_color;
+ margin: 0 0 10px 0;
+ padding: 5px;
+}
+
 .LC_fontsize_medium {
  font-size: 85%;
 }
@@ -4819,7 +4889,6 @@ table#LC_mainmenu td.LC_mainmenu_column
 
 .LC_menubuttons_inline_text {
   color: $font;
-  font-family: $sans;
   font-size: 90%;
   padding-left:3px;
 }
@@ -4831,7 +4900,6 @@ table#LC_mainmenu td.LC_mainmenu_column
 .LC_menubuttons_category {
   color: $font;
   background: $pgbg;
-  font-family: $sans;
   font-size: larger;
   font-weight: bold;
 }
@@ -4841,21 +4909,14 @@ td.LC_menubuttons_text {
 }
 
 .LC_current_location {
-  font-family: $sans;
   background: $tabbg;
 }
 
 .LC_new_mail {
-  font-family: $sans;
   background: $tabbg;
   font-weight: bold;
 }
 
-.LC_preferences_labeltext {
-  font-family: $sans;
-  text-align: right;
-}
-
 .LC_roleslog_note {
   font-size: small;
 }
@@ -5111,7 +5172,6 @@ span.LC_current_location {
 
 span.LC_parm_menu_item {
   font-size: larger;
-  font-family: $sans;
 }
 
 span.LC_parm_scope_all {
@@ -5354,7 +5414,6 @@ table.LC_notify_front_page td {
 }
 
 .LC_topic_bar {
-  font-family: $sans;
   font-weight: bold;
   width: 100%;
   background: $tabbg;
@@ -5383,17 +5442,23 @@ table.LC_status_selector td {
 
 div.LC_feedback_link {
   clear: both;
-  background: white;
+  background: $sidebg;
   width: 100%;
+  padding-bottom: 10px;
+  border: 1px $tabbg solid;
+}
+
+div.LC_feedback_link a{
+  text-decoration: none;
 }
 
 span.LC_feedback_link {
-  background: $feedback_link_bg;
+  //background: $feedback_link_bg;
   font-size: larger;
 }
 
 span.LC_message_link {
-  background: $feedback_link_bg;
+  //background: $feedback_link_bg;
   font-size: larger;
   position: absolute;
   right: 1em;
@@ -5411,14 +5476,12 @@ table.LC_prior_tries td {
 
 .LC_answer_correct {
   background: lightgreen;
-  font-family: $sans;
   color: darkgreen;
   padding: 6px;
 }
 
 .LC_answer_charged_try {
   background: #FFAAAA;
-  font-family: $sans;
   color: darkred;
   padding: 6px;
 }
@@ -5427,28 +5490,24 @@ table.LC_prior_tries td {
 .LC_answer_no_grade,
 .LC_answer_late {
   background: lightyellow;
-  font-family: $sans;
   color: black;
   padding: 6px;
 }
 
 .LC_answer_previous {
   background: lightblue;
-  font-family: $sans;
   color: darkblue;
   padding: 6px;
 }
 
 .LC_answer_no_message {
   background: #FFFFFF;
-  font-family: $sans;
   color: black;
   padding: 6px;
 }
 
 .LC_answer_unknown {
   background: orange;
-  font-family: $sans;
   color: black;
   padding: 6px;
 }
@@ -5686,12 +5745,6 @@ div.LC_edit_problem_editxml_header div {
   margin-top: 5px;
 }
 
-div.LC_edit_problem_header_edit_row {
-  background: $tabbg;
-  padding: 3px;
-  margin-bottom: 5px;
-}
-
 div.LC_edit_problem_header_title {
   font-weight: bold;
   font-size: larger;
@@ -5747,7 +5800,6 @@ table#LC_mainmenu td.LC_mainmenu_col_fie
 .LC_mainmenu_fieldset_category {
   color: $font;
   background: $pgbg;
-  font-family: $sans;
   font-size: small;
   font-weight: bold;
 }
@@ -5952,7 +6004,7 @@ ul.LC_TabContentBigger li a {
 
 ol#LC_MenuBreadcrumbs, 
 ol#LC_PathBreadcrumbs, 
-ul.LC_CourseBreadcrumbs {
+ul#LC_CourseBreadcrumbs {
 	padding-left: 10px;
 	margin: 0;
 	list-style-position: inside;
@@ -5960,13 +6012,14 @@ ul.LC_CourseBreadcrumbs {
 
 ol#LC_MenuBreadcrumbs li, 
 ol#LC_PathBreadcrumbs li, 
-ul.LC_CourseBreadcrumbs li {
+ul#LC_CourseBreadcrumbs li {
 	display: inline;
 	padding: 0 0 0 10px;
 	overflow:hidden;
 }
 
-ol#LC_MenuBreadcrumbs li a, ul.LC_CourseBreadcrumbs li a {
+ol#LC_MenuBreadcrumbs li a,
+ul#LC_CourseBreadcrumbs li a {
 	text-decoration: none;
 	font-size:90%;
 }
@@ -6456,9 +6509,6 @@ $args - additional optional args support
                                     a html attribute
              force_register -> if is true will turn on the &bodytag()
                                     $forcereg arg
-             body_title     -> alternate text to use instead of $title
-                                    in the title box that appears, this text
-                                    is not auto translated like the $title is
              frameset       -> if true will start with a <frameset>
                                     rather than <body>
              skip_phases    -> hash ref of 
@@ -6502,16 +6552,15 @@ sub start_page {
 	    my $attr_string = &make_attr_string($args->{'force_register'},
 						$args->{'add_entries'});
 	    $result .= "\n<frameset $attr_string>\n";
-	} else {
-	    $result .=
-		&bodytag($title, 
-			 $args->{'function'},       $args->{'add_entries'},
-			 $args->{'only_body'},      $args->{'domain'},
-			 $args->{'force_register'}, $args->{'body_title'},
-			 $args->{'no_nav_bar'},     $args->{'bgcolor'},
-			 $args->{'no_inline_link'},
-			 $args);
-	}
+        } else {
+            $result .=
+                &bodytag($title, 
+                         $args->{'function'},       $args->{'add_entries'},
+                         $args->{'only_body'},      $args->{'domain'},
+                         $args->{'force_register'}, $args->{'no_nav_bar'},
+                         $args->{'bgcolor'},        $args->{'no_inline_link'},
+                         $args);
+        }
     }
 
     if ($args->{'js_ready'}) {
@@ -6783,7 +6832,7 @@ sub get_users_function {
     if ($env{'request.role'}=~/^(su|dc|ad|li)/) {
         $function='admin';
     }
-    if (($env{'request.role'}=~/^(au|ca)/) ||
+    if (($env{'request.role'}=~/^(au|ca|aa)/) ||
         ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) {
         $function='author';
     }
@@ -6794,6 +6843,38 @@ sub get_users_function {
 
 =pod
 
+=item * &show_course()
+
+Used by lonmenu.pm and lonroles.pm to determine whether to use the word
+'Courses' or 'Roles' in inline navigation and on screen displaying user's roles.
+
+Inputs:
+None
+
+Outputs:
+Scalar: 1 if 'Course' to be used, 0 otherwise.
+
+=cut
+
+###############################################
+sub show_course {
+    my $course = !$env{'user.adv'};
+    if (!$env{'user.adv'}) {
+        foreach my $env (keys(%env)) {
+            next if ($env !~ m/^user\.priv\./);
+            if ($env !~ m/^user\.priv\.(?:st|cm)/) {
+                $course = 0;
+                last;
+            }
+        }
+    }
+    return $course;
+}
+
+###############################################
+
+=pod
+
 =item * &check_user_status()
 
 Determines current status of supplied role for a
@@ -7537,6 +7618,7 @@ ENDSCRIPT
 
     my $output = <<"END_BLOCK";
 <script type="text/javascript">
+// <![CDATA[
 function validateEntry(callingForm) {
 
     var checkok = 1;
@@ -7605,6 +7687,7 @@ function validateEntry(callingForm) {
 
 $newuserscript
 
+// ]]>
 </script>
 
 $new_user_create
@@ -10212,6 +10295,22 @@ sub escape_url {
     return join('/',@urlslices).'/'.$lastitem;
 }
 
+sub compare_arrays {
+    my ($arrayref1,$arrayref2) = @_;
+    my (@difference,%count);
+    @difference = ();
+    %count = ();
+    if ((ref($arrayref1) eq 'ARRAY') && (ref($arrayref2) eq 'ARRAY')) {
+        foreach my $element (@{$arrayref1}, @{$arrayref2}) { $count{$element}++; }
+        foreach my $element (keys(%count)) {
+            if ($count{$element} == 1) {
+                push(@difference,$element);
+            }
+        }
+    }
+    return @difference;
+}
+
 # -------------------------------------------------------- Initialize user login
 sub init_user_environment {
     my ($r, $username, $domain, $authhost, $form, $args) = @_;