--- loncom/interface/loncommon.pm	2011/08/15 05:16:30	1.1017
+++ loncom/interface/loncommon.pm	2011/12/08 22:42:33	1.1033
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1017 2011/08/15 05:16:30 raeburn Exp $
+# $Id: loncommon.pm,v 1.1033 2011/12/08 22:42:33 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -633,7 +633,7 @@ ENDJS
 }
 
 sub javascript_array_indexof {
-    return <<ENDJS; 
+    return <<ENDJS;
 <script type="text/javascript" language="JavaScript">
 // <![CDATA[
 
@@ -847,6 +847,9 @@ sub selectcourse_link {
    } elsif ($selecttype eq 'Course/Community') {
        $linktext = &mt('Select Course/Community');
        $type = '';
+   } elsif ($selecttype eq 'Select') {
+       $linktext = &mt('Select');
+       $type = '';
    }
    return '<span class="LC_nobreak">'
          ."<a href='"
@@ -1183,7 +1186,7 @@ sub help_open_topic {
     my ($topic, $text, $stayOnPage, $width, $height, $imgid) = @_;
     $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);
-    $width = 350 if (not defined $width);
+    $width = 500 if (not defined $width);
     $height = 400 if (not defined $height);
     my $filename = $topic;
     $filename =~ s/ /_/g;
@@ -1194,7 +1197,7 @@ sub help_open_topic {
     $topic=~s/\W/\_/g;
 
     if (!$stayOnPage) {
-	$link = "javascript:void(open('/adm/help/${filename}.hlp', 'Help_for_$topic', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height,resizable=yes'))";
+	$link = "javascript:openMyModal('/adm/help/${filename}.hlp',$width,$height,'yes');";
     } else {
 	$link = "/adm/help/${filename}.hlp";
     }
@@ -4443,7 +4446,7 @@ sub get_legacy_domconf {
             close($fh);
         }
     }
-    if (-e '/home/httpd/html/adm/lonDomLogos/'.$udom.'.gif') {
+    if (-e $Apache::lonnet::perlvar{'lonDocRoot'}.'/adm/lonDomLogos/'.$udom.'.gif') {
         $legacyhash{$udom.'.login.domlogo'} = "/adm/lonDomLogos/$udom.gif";
     }
     return %legacyhash;
@@ -4529,27 +4532,39 @@ sub designparm {
 
 =item * &authorspace()
 
-Inputs: ./.
+Inputs: $url (usually will be undef).
 
-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
+Returns: Path to Construction Space containing the resource or 
+         directory being viewed (or for which action is being taken). 
+         If $url is provided, and begins /priv/<domain>/<uname>
+         the path will be that portion of the $context argument.
+         Otherwise the path will be for the author space of the current
+         user when the current role is author, or for that of the 
+         co-author/assistant co-author space when the current role 
+         is co-author or assistant co-author.
 
 =cut
 
 sub authorspace {
+    my ($url) = @_;
+    if ($url ne '') {
+        if ($url =~ m{^(/priv/$match_domain/$match_username/)}) {
+           return $1;
+        }
+    }
     my $caname = '';
-    if ($env{'request.role'} =~ /^ca|^aa/) {
-        (undef,$caname) =
+    my $cadom = '';
+    if ($env{'request.role'} =~ /^(?:ca|aa)/) {
+        ($cadom,$caname) =
             ($env{'request.role'}=~/($match_domain)\/($match_username)$/);
-    } else {
+    } elsif ($env{'request.role'} =~ m{^au\./($match_domain)/}) {
         $caname = $env{'user.name'};
+        $cadom = $env{'user.domain'};
+    }
+    if (($caname ne '') && ($cadom ne '')) {
+        return "/priv/$cadom/$caname/";
     }
-    return '/priv/'.$caname.'/';
+    return;
 }
 
 ##############################################
@@ -4577,7 +4592,9 @@ sub head_subbox {
 
 =item * &CSTR_pageheader()
 
-Inputs: ./.
+Input: (optional) filename from which breadcrumb trail is built.
+       In most cases no input as needed, as $env{'request.filename'}
+       is appropriate for use in building the breadcrumb trail.
 
 Returns: HTML div with CSTR path and recent box
          To be included on Construction Space pages
@@ -4585,12 +4602,19 @@ Returns: HTML div with CSTR path and rec
 =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 ($trailfile) = @_;
+    if ($trailfile eq '') {
+        $trailfile = $env{'request.filename'};
+    }
+
+# this is for resources; directories have customtitle, and crumbs
+# and select recent are created in lonpubdir.pm
+
+    my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
+    my ($udom,$uname,$thisdisfn)=
+        ($trailfile =~ m{^\Q$londocroot\E/priv/([^/]+)/([^/]+)/(.*)$});
+    my $formaction = "/priv/$udom/$uname/$thisdisfn";
+    $formaction =~ s{/+}{/}g;
 
     my $parentpath = '';
     my $lastitem = '';
@@ -4607,7 +4631,7 @@ sub CSTR_pageheader {
         .'<b>'.&mt('Construction Space:').'</b> '
         .'<form name="dirs" method="post" action="'.$formaction
         .'" target="_top">' #FIXME lonpubdir: target="_parent"
-        .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv',undef,undef);
+        .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv/'.$udom,undef,undef);
 
     if ($lastitem) {
         $output .=
@@ -5500,6 +5524,11 @@ span.LC_current_location {
   background: $pgbg;
 }
 
+span.LC_current_nav_location {
+  font-weight:bold;
+  background: $sidebg;
+}
+
 span.LC_parm_menu_item {
   font-size: larger;
 }
@@ -6225,7 +6254,7 @@ ul.LC_TabContent {
   background: $sidebg;
   border-bottom: solid 1px $lg_border_color;
   list-style:none;
-  margin: 0 -10px;
+  margin: -1px -10px 0 -10px;
   padding: 0;
 }
 
@@ -6248,7 +6277,7 @@ ul.LC_TabContent li {
   padding: 0 16px 0 10px;
   background-color:$tabbg;
   border-bottom:solid 1px $lg_border_color;
-  border-right: solid 1px $font;
+  border-left: solid 1px $font;
 }
 
 ul.LC_TabContent .right {
@@ -6347,11 +6376,10 @@ ul.LC_TabContentBigger li.active b {
 
 ul.LC_CourseBreadcrumbs {
   background: $sidebg;
-  line-height: 32px;
+  height: 2em;
   padding-left: 10px;
-  margin: 0 0 10px 0;
+  margin: 0;
   list-style-position: inside;
-
 }
 
 ol#LC_MenuBreadcrumbs,
@@ -6393,6 +6421,11 @@ ol#LC_PathBreadcrumbs li a {
   padding: 0 10px 10px 10px;
 }
 
+.LC_DocsBox {
+  border: solid 1px $lg_border_color;
+  padding: 0 0 10px 10px;
+}
+
 .LC_AboutMe_Image {
   float:left;
   margin-right:10px;
@@ -6601,6 +6634,53 @@ ul.LC_funclist li {
   display: none;
 }
 
+.LCmodal-overlay {
+		position:fixed;
+		top:0;
+		right:0;
+		bottom:0;
+		left:0;
+		height:100%;
+		width:100%;
+		margin:0;
+		padding:0;
+		background:#999;
+		opacity:.75;
+		filter: alpha(opacity=75);
+		-moz-opacity: 0.75;
+		z-index:101;
+}
+
+* html .LCmodal-overlay {   
+		position: absolute;
+		height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px');
+}
+
+.LCmodal-window {
+		position:fixed;
+		top:50%;
+		left:50%;
+		margin:0;
+		padding:0;
+		z-index:102;
+	}
+
+* html .LCmodal-window {
+		position:absolute;
+}
+
+.LCclose-window {
+		position:absolute;
+		width:32px;
+		height:32px;
+		right:8px;
+		top:8px;
+		background:transparent url('/res/adm/pages/process-stop.png') no-repeat scroll right top;
+		text-indent:-99999px;
+		overflow:hidden;
+		cursor:pointer;
+}
+
 END
 }
 
@@ -6659,8 +6739,8 @@ sub headtag {
 	&& !$args->{'only_body'}
 	&& !$args->{'frameset'}) {
 	$result .= &help_menu_js();
+        $result.=&modal_window();
     }
-
     if (ref($args->{'redirect'})) {
 	my ($time,$url,$inhibit_continue) = @{$args->{'redirect'}};
 	$url = &Apache::lonenc::check_encrypt($url);
@@ -6785,32 +6865,12 @@ $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',
-		     'no_auto_mt_title') {
-	if (defined($args->{$arg})) {
-	    $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);
-#replace prev line by
-#                 &xml_begin() . &headtag($title, $head_extra, $args);
+        $result .= &xml_begin() . &headtag($title, $head_extra, $args);
     }
     
     if (! exists($args->{'skip_phases'}{'body'}) ) {
@@ -6876,7 +6936,6 @@ sub end_page {
 	}
 	$result .= &Apache::lonxml::xmlend($target,$parser);
     }
-
     if ($args->{'frameset'}) {
 	$result .= '</frameset>';
     } else {
@@ -6895,6 +6954,78 @@ sub end_page {
     return $result;
 }
 
+sub modal_window {
+    return(<<'ENDMODAL');
+<script type="text/javascript" lang="javascript">
+// <![CDATA[
+// <!-- BEGIN LON-CAPA Internal
+var modalWindow = {
+	parent:"body",
+	windowId:null,
+	content:null,
+	width:null,
+	height:null,
+	close:function()
+	{
+	        $(".LCmodal-window").remove();
+	        $(".LCmodal-overlay").remove();
+	},
+	open:function()
+	{
+		var modal = "";
+		modal += "<div class=\"LCmodal-overlay\"></div>";
+		modal += "<div id=\"" + this.windowId + "\" class=\"LCmodal-window\" style=\"width:" + this.width + "px; height:" + this.height + "px; margin-top:-" + (this.height / 2) + "px; margin-left:-" + (this.width / 2) + "px;\">";
+		modal += this.content;
+		modal += "</div>";	
+
+		$(this.parent).append(modal);
+
+		$(".LCmodal-window").append("<a class=\"LCclose-window\"></a>");
+		$(".LCclose-window").click(function(){modalWindow.close();});
+		$(".LCmodal-overlay").click(function(){modalWindow.close();});
+	}
+};
+	var openMyModal = function(source,width,height,scrolling)
+	{
+		modalWindow.windowId = "myModal";
+		modalWindow.width = width;
+		modalWindow.height = height;
+		modalWindow.content = "<iframe width='"+width+"' height='"+height+"' frameborder='0' scrolling='"+scrolling+"' allowtransparency='true' src='" + source + "'>&lt/iframe>";
+		modalWindow.open();
+	};	
+// END LON-CAPA Internal -->
+// ]]>
+</script>
+ENDMODAL
+}
+
+sub modal_link {
+    my ($link,$linktext,$width,$height,$target,$scrolling)=@_;
+    unless ($width) { $width=480; }
+    unless ($height) { $height=400; }
+    unless ($scrolling) { $scrolling='yes'; }
+    return '<a href="'.$link.'" target="'.$target.'" onclick="openMyModal(\''.$link.'\','.$width.','.$height.',\''.$scrolling.'\'); return false;">'.
+           $linktext.'</a>';
+}
+
+sub modal_adhoc_script {
+    my ($funcname,$width,$height,$content)=@_;
+    return (<<ENDADHOC);
+<script type="text/javascript" lang="javascript">
+// <![CDATA[
+        var $funcname = function()
+        {
+                modalWindow.windowId = "myModal";
+                modalWindow.width = $width;
+                modalWindow.height = $height;
+                modalWindow.content = '$content';
+                modalWindow.open();
+        };  
+// ]]>
+</script>
+ENDADHOC
+}
+
 sub html_encode {
     my ($result) = @_;
 
@@ -6940,11 +7071,16 @@ sub validate_page {
 
 
 sub start_scrollbox {
-    my ($outerwidth,$width,$height)=@_;
+    my ($outerwidth,$width,$height,$id)=@_;
     unless ($outerwidth) { $outerwidth='520px'; }
     unless ($width) { $width='500px'; }
     unless ($height) { $height='200px'; }
-    return "<table style='width: $outerwidth; border: 1px solid black;'><tr><td style='width: $width;' bgcolor='#FFFFFF'><div style='overflow:auto; width:$width; height: $height;'>";
+    my ($table_id,$div_id);
+    if ($id ne '') {
+        $table_id = " id='table_$id'";
+        $div_id = " id='div_$id'";
+    }
+    return "<table style='width: $outerwidth; border: 1px solid none;'$table_id><tr><td style='width: $width;' bgcolor='#FFFFFF'><div style='overflow:auto; width:$width; height: $height;'$div_id>";
 }
 
 sub end_scrollbox {
@@ -6978,10 +7114,14 @@ sub simple_error_page {
     }
 
     sub start_data_table {
-	my ($add_class) = @_;
+	my ($add_class,$id) = @_;
 	my $css_class = (join(' ','LC_data_table',$add_class));
+        my $table_id;
+        if (defined($id)) {
+            $table_id = ' id="'.$id.'"';
+        }
 	&start_data_table_count();
-	return '<table class="'.$css_class.'">'."\n";
+	return '<table class="'.$css_class.'"'.$table_id.'>'."\n";
     }
 
     sub end_data_table {
@@ -7108,7 +7248,7 @@ sub get_users_function {
         $function='admin';
     }
     if (($env{'request.role'}=~/^(au|ca|aa)/) ||
-        ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) {
+        ($ENV{'REQUEST_URI'}=~ m{/^(/priv)})) {
         $function='author';
     }
     return $function;
@@ -8432,8 +8572,8 @@ sub ask_for_embedded_content {
         $getpropath = 1;
     } elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank') ||
              ($actionurl eq '/adm/imsimport')) { 
-        ($uname,my $rest) = ($args->{'current_path'} =~ m{/priv/($match_username)/?(.*)$});
-        $url = '/home/'.$uname.'/public_html/';
+        my ($udom,$uname,$rest) = ($args->{'current_path'} =~ m{/priv/($match_domain)/($match_username)/?(.*)$});
+        $url = $Apache::lonnet::perlvar{'lonDocRoot'}."/priv/$udom/$uname/";
         $toplevel = $url;
         if ($rest ne '') {
             $url .= $rest;
@@ -8483,10 +8623,13 @@ sub ask_for_embedded_content {
     foreach my $path (keys(%subdependencies)) {
         my %currsubfile;
         if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { 
-            my @subdir_list = &Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath);
-            foreach my $line (@subdir_list) {
-                my ($file_name,$rest) = split(/\&/,$line,2);
-                $currsubfile{$file_name} = 1;
+            my ($sublistref,$listerror) =
+                &Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath);
+            if (ref($sublistref) eq 'ARRAY') {
+                foreach my $line (@{$sublistref}) {
+                    my ($file_name,$rest) = split(/\&/,$line,2);
+                    $currsubfile{$file_name} = 1;
+                }
             }
         } elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank')) {
             if (opendir(my $dir,$url.'/'.$path)) {
@@ -8509,10 +8652,13 @@ sub ask_for_embedded_content {
     }
     my %currfile;
     if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) {
-        my @dir_list = &Apache::lonnet::dirlist($url,$udom,$uname,$getpropath);
-        foreach my $line (@dir_list) {
-            my ($file_name,$rest) = split(/\&/,$line,2);
-            $currfile{$file_name} = 1;
+        my ($dirlistref,$listerror) =
+            &Apache::lonnet::dirlist($url,$udom,$uname,$getpropath);
+        if (ref($dirlistref) eq 'ARRAY') {
+            foreach my $line (@{$dirlistref}) {
+                my ($file_name,$rest) = split(/\&/,$line,2);
+                $currfile{$file_name} = 1;
+            }
         }
     } elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank')) {
         if (opendir(my $dir,$url)) {
@@ -8791,12 +8937,12 @@ sub upload_embedded {
             my $fullpath = $dir_root.$dirpath.'/'.$path;
             my $dest = $fullpath.$fname;
             my $url = $url_root.$dirpath.'/'.$path.$fname;
-            my @parts=split(/\//,$fullpath);
+            my @parts=split(/\//,"$dirpath/$path");
             my $count;
             my $filepath = $dir_root;
-            for ($count=4;$count<=$#parts;$count++) {
-                $filepath .= "/$parts[$count]";
-                if ((-e $filepath)!=1) {
+            foreach my $subdir (@parts) {
+                $filepath .= "/$subdir";
+                if (!-e $filepath) {
                     mkdir($filepath,0770);
                 }
             }
@@ -8915,8 +9061,7 @@ sub modify_html_refs {
     } elsif ($context eq 'coursedoc') {
         $container = $env{'form.primaryurl'};
     } else {
-        $container = $env{'form.filename'};
-        $container =~ s{^/priv/(\Q$uname\E)/(.*)}{/home/$1/public_html/$2};
+        $container = $Apache::lonnet::perlvar{'lonDocRoot'}.$env{'form.filename'};
     }
     my (%allfiles,%codebase,$output,$content);
     my @changes = &get_env_multiple('form.namechange');
@@ -9032,8 +9177,8 @@ sub check_for_upload {
     }
     $filesize =  $filesize/1000; #express in k (1024?)
     my $getpropath = 1;
-    my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname,
-                                            $getpropath);
+    my ($dirlistref,$listerror) =
+         &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname,$getpropath);
     my $found_file = 0;
     my $locked_file = 0;
     my @lockers;
@@ -9041,48 +9186,50 @@ sub check_for_upload {
     if ($env{'request.course.id'}) {
         $navmap = Apache::lonnavmaps::navmap->new();
     }
-    foreach my $line (@dir_list) {
-        my ($file_name,$rest)=split(/\&/,$line,2);
-        if ($file_name eq $fname){
-            $file_name = $path.$file_name;
-            if ($group ne '') {
-                $file_name = $group.$file_name;
-            }
-            $found_file = 1;
-            if (&Apache::lonnet::is_locked($file_name,$udom,$uname,\@lockers) eq 'true') {
-                foreach my $lock (@lockers) {
-                    if (ref($lock) eq 'ARRAY') {
-                        my ($symb,$crsid) = @{$lock};
-                        if ($crsid eq $env{'request.course.id'}) {
-                            if (ref($navmap)) {
-                                my $res = $navmap->getBySymb($symb);
-                                foreach my $part (@{$res->parts()}) { 
-                                    my ($slot_status,$slot_time,$slot_name)=$res->check_for_slot($part);
-                                    unless (($slot_status == $res->RESERVED) ||
-                                            ($slot_status == $res->RESERVED_LOCATION)) {
-                                        $locked_file = 1;
+    if (ref($dirlistref) eq 'ARRAY') {
+        foreach my $line (@{$dirlistref}) {
+            my ($file_name,$rest)=split(/\&/,$line,2);
+            if ($file_name eq $fname){
+                $file_name = $path.$file_name;
+                if ($group ne '') {
+                    $file_name = $group.$file_name;
+                }
+                $found_file = 1;
+                if (&Apache::lonnet::is_locked($file_name,$udom,$uname,\@lockers) eq 'true') {
+                    foreach my $lock (@lockers) {
+                        if (ref($lock) eq 'ARRAY') {
+                            my ($symb,$crsid) = @{$lock};
+                            if ($crsid eq $env{'request.course.id'}) {
+                                if (ref($navmap)) {
+                                    my $res = $navmap->getBySymb($symb);
+                                    foreach my $part (@{$res->parts()}) { 
+                                        my ($slot_status,$slot_time,$slot_name)=$res->check_for_slot($part);
+                                        unless (($slot_status == $res->RESERVED) ||
+                                                ($slot_status == $res->RESERVED_LOCATION)) {
+                                            $locked_file = 1;
+                                        }
                                     }
+                                } else {
+                                    $locked_file = 1;
                                 }
                             } else {
                                 $locked_file = 1;
                             }
-                        } else {
-                            $locked_file = 1;
                         }
-                    }
-                }
-            } else {
-                my @info = split(/\&/,$rest);
-                my $currsize = $info[6]/1000;
-                if ($currsize < $filesize) {
-                    my $extra = $filesize - $currsize;
-                    if (($current_disk_usage + $extra) > $disk_quota) {
-                        my $msg = '<span class="LC_error">'.
-                                  &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded if existing (smaller) file with same name (size = [_3] kilobytes) is replaced.',
-                                      '<span class="LC_filename">'.$fname.'</span>',$filesize,$currsize).'</span>'.
-                                  '<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',
-                                               $disk_quota,$current_disk_usage);
-                        return ('will_exceed_quota',$msg);
+                   }
+                } else {
+                    my @info = split(/\&/,$rest);
+                    my $currsize = $info[6]/1000;
+                    if ($currsize < $filesize) {
+                        my $extra = $filesize - $currsize;
+                        if (($current_disk_usage + $extra) > $disk_quota) {
+                            my $msg = '<span class="LC_error">'.
+                                      &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded if existing (smaller) file with same name (size = [_3] kilobytes) is replaced.',
+                                          '<span class="LC_filename">'.$fname.'</span>',$filesize,$currsize).'</span>'.
+                                      '<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',
+                                                   $disk_quota,$current_disk_usage);
+                            return ('will_exceed_quota',$msg);
+                        }
                     }
                 }
             }