[LON-CAPA-cvs] cvs: loncom /interface lonnavmaps.pm

albertel lon-capa-cvs@mail.lon-capa.org
Fri, 15 Mar 2002 16:31:10 -0000


This is a MIME encoded message

--albertel1016209870
Content-Type: text/plain

albertel		Fri Mar 15 11:31:10 2002 EDT

  Modified files:              
    /loncom/interface	lonnavmaps.pm 
  Log:
  - reindented to be consistent thru out the handler and tracetable functions
  
  
--albertel1016209870
Content-Type: text/plain
Content-Disposition: attachment; filename="albertel-20020315113110.txt"

Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.27 loncom/interface/lonnavmaps.pm:1.28
--- loncom/interface/lonnavmaps.pm:1.27	Thu Feb 28 14:45:14 2002
+++ loncom/interface/lonnavmaps.pm	Fri Mar 15 11:31:10 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Navigate Maps Handler
 #
-# $Id: lonnavmaps.pm,v 1.27 2002/02/28 19:45:14 albertel Exp $
+# $Id: lonnavmaps.pm,v 1.28 2002/03/15 16:31:10 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -269,88 +269,87 @@
     my ($sofar,$rid,$beenhere)=@_;
     my $further=$sofar;
     unless ($beenhere=~/\&$rid\&/) {
-       $beenhere.=$rid.'&';  
-
-       if (defined($hash{'is_map_'.$rid})) {
-           $sofar++;
-           my $tprefix='';
-           if ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} 
-            eq 'sequence') { 
-               $tprefix='h'; 
-           }
-           if (defined($rows[$sofar])) {
-              $rows[$sofar].='&'.$tprefix.$rid;
-           } else {
-              $rows[$sofar]=$tprefix.$rid;
-           }
-           if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) &&
-               (defined($hash{'map_finish_'.$hash{'src_'.$rid}})) &&
-               ($tprefix eq 'h')) {
-              my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
-	      $sofar=
-                &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}},
-                '&'.$frid.'&');
-              $sofar++;
-              if ($hash{'src_'.$frid}) {
-               my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid});
-               if (($brepriv eq '2') || ($brepriv eq 'F')) {
-		 my $pprefix='';
-                 if ($hash{'src_'.$frid}=~
-                                 /\.(problem|exam|quiz|assess|survey|form)$/) {
-		     $pprefix=&astatus($frid);
-
-                 }
-                 if (defined($rows[$sofar])) {
-                   $rows[$sofar].='&'.$pprefix.$frid;
-                 } else {
-                   $rows[$sofar]=$pprefix.$frid;
-                 }
-	       }
-	      }
-	   }
-       } else {
-          $sofar++;
-          if ($hash{'src_'.$rid}) {
-           my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid});
-           if (($brepriv eq '2') || ($brepriv eq 'F')) {
-	     my $pprefix='';
-             if ($hash{'src_'.$rid}=~
-                                 /\.(problem|exam|quiz|assess|survey|form)$/) {
-	         $pprefix=&astatus($rid);
-             }
-             if (defined($rows[$sofar])) {
-                $rows[$sofar].='&'.$pprefix.$rid;
-             } else {
-               $rows[$sofar]=$pprefix.$rid;
-             }
-	   }
-          }
-       }
-
-       if (defined($hash{'to_'.$rid})) {
-	  my $mincond=1;
-          my $next='';
-          foreach (split(/\,/,$hash{'to_'.$rid})) {
-              my $thiscond=
-      &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});
-              if ($thiscond>=$mincond) {
-		  if ($next) {
-		      $next.=','.$_.':'.$thiscond;
-                  } else {
-                      $next=$_.':'.$thiscond;
-		  }
-                  if ($thiscond>$mincond) { $mincond=$thiscond; }
-	      }
-          }
-          foreach (split(/\,/,$next)) {
-              my ($linkid,$condval)=split(/\:/,$_);
-              if ($condval>=$mincond) {
-                my $now=&tracetable($sofar,$hash{'goesto_'.$linkid},$beenhere);
-                if ($now>$further) { $further=$now; }
-	      }
-          }
-
-       }
+	$beenhere.=$rid.'&';  
+	
+	if (defined($hash{'is_map_'.$rid})) {
+	    $sofar++;
+	    my $tprefix='';
+	    if ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} 
+		eq 'sequence') { 
+		$tprefix='h'; 
+	    }
+	    if (defined($rows[$sofar])) {
+		$rows[$sofar].='&'.$tprefix.$rid;
+	    } else {
+		$rows[$sofar]=$tprefix.$rid;
+	    }
+	    if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) &&
+		(defined($hash{'map_finish_'.$hash{'src_'.$rid}})) &&
+		($tprefix eq 'h')) {
+		my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
+		$sofar=
+		    &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}},
+				'&'.$frid.'&');
+		$sofar++;
+		if ($hash{'src_'.$frid}) {
+		    my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid});
+		    if (($brepriv eq '2') || ($brepriv eq 'F')) {
+			my $pprefix='';
+			if ($hash{'src_'.$frid}=~
+			    /\.(problem|exam|quiz|assess|survey|form)$/) {
+			    $pprefix=&astatus($frid);
+			
+			}
+			if (defined($rows[$sofar])) {
+			    $rows[$sofar].='&'.$pprefix.$frid;
+			} else {
+			    $rows[$sofar]=$pprefix.$frid;
+			}
+		    }
+		}
+	    }
+	} else {
+	    $sofar++;
+	    if ($hash{'src_'.$rid}) {
+		my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid});
+		if (($brepriv eq '2') || ($brepriv eq 'F')) {
+		    my $pprefix='';
+		    if ($hash{'src_'.$rid}=~
+			/\.(problem|exam|quiz|assess|survey|form)$/) {
+			$pprefix=&astatus($rid);
+		    }
+		    if (defined($rows[$sofar])) {
+			$rows[$sofar].='&'.$pprefix.$rid;
+		    } else {
+			$rows[$sofar]=$pprefix.$rid;
+		    }
+		}
+	    }
+	}
+	
+	if (defined($hash{'to_'.$rid})) {
+	    my $mincond=1;
+	    my $next='';
+	    foreach (split(/\,/,$hash{'to_'.$rid})) {
+		my $thiscond=
+		    &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});
+		if ($thiscond>=$mincond) {
+		    if ($next) {
+			$next.=','.$_.':'.$thiscond;
+		    } else {
+			$next=$_.':'.$thiscond;
+		    }
+		    if ($thiscond>$mincond) { $mincond=$thiscond; }
+		}
+	    }
+	    foreach (split(/\,/,$next)) {
+		my ($linkid,$condval)=split(/\:/,$_);
+		if ($condval>=$mincond) {
+		    my $now=&tracetable($sofar,$hash{'goesto_'.$linkid},$beenhere);
+		    if ($now>$further) { $further=$now; }
+		}
+	    }
+	}
     }
     return $further;
 }
@@ -358,337 +357,330 @@
 # ================================================================ Main Handler
 
 sub handler {
-  my $r=shift;
+    my $r=shift;
 
 
 # ------------------------------------------- Set document type for header only
 
-  if ($r->header_only) {
-       if ($ENV{'browser.mathml'}) {
-           $r->content_type('text/xml');
-       } else {
-           $r->content_type('text/html');
-       }
-       $r->send_http_header;
-       return OK;
-   }
-  my $requrl=$r->uri;
+    if ($r->header_only) {
+	if ($ENV{'browser.mathml'}) {
+	    $r->content_type('text/xml');
+	} else {
+	    $r->content_type('text/html');
+	}
+	$r->send_http_header;
+	return OK;
+    }
+    my $requrl=$r->uri;
+    my $hashtied;
 # ----------------------------------------------------------------- Tie db file
-  if ($ENV{'request.course.fn'}) {
-      my $fn=$ENV{'request.course.fn'};
-      if (-e "$fn.db") {
-          if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) &&
-             (tie(%parmhash,'GDBM_File',
-           $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640))) {
+    my $fn;
+    if ($ENV{'request.course.fn'}) {
+	$fn=$ENV{'request.course.fn'};
+	if (-e "$fn.db") {
+	    if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) &&
+		(tie(%parmhash,'GDBM_File',
+		     $ENV{'request.course.fn'}.'_parms.db',
+		     &GDBM_READER,0640))) {
+		$hashtied=1;
+	    }
+	}
+    }
+    if (!$hashtied) {
+	$ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
+	return HTTP_NOT_ACCEPTABLE; 
+    }
+
 # ------------------------------------------------------------------- Hash tied
-              my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}};
-              my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}};
-              if (($firstres) && ($lastres)) {
+
+    if ($ENV{'browser.mathml'}) {
+	$r->content_type('text/xml');
+    } else {
+	$r->content_type('text/html');
+    }
+    &Apache::loncommon::no_cache($r);
+    $r->send_http_header;
+
+    my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}};
+    my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}};
+    if (!(($firstres) && ($lastres))) {
+	$r->print('<html><body>Coursemap undefined.</body></html>');
+    } else {
+
 # ----------------------------------------------------------------- Render page
 # -------------------------------------------------------------- Set parameters
 
 
 # ---------------------------- initialize coursedata and userdata for this user
-    undef %courseopt;
-    undef %useropt;
+	undef %courseopt;
+	undef %useropt;
 
-    my $uname=$ENV{'user.name'};
-    my $udom=$ENV{'user.domain'};
-    my $uhome=$ENV{'user.home'};
-    my $cid=$ENV{'request.course.id'};
-    my $chome=$ENV{'course.'.$cid.'.home'};
-    my ($cdom,$cnum)=split(/\_/,$cid);
+	my $uname=$ENV{'user.name'};
+	my $udom=$ENV{'user.domain'};
+	my $uhome=$ENV{'user.home'};
+	my $cid=$ENV{'request.course.id'};
+	my $chome=$ENV{'course.'.$cid.'.home'};
+	my ($cdom,$cnum)=split(/\_/,$cid);
 
-    my $userprefix=$uname.'_'.$udom.'_';
+	my $userprefix=$uname.'_'.$udom.'_';
 
-    unless ($uhome eq 'no_host') { 
+	unless ($uhome eq 'no_host') { 
 # -------------------------------------------------------------- Get coursedata
-      unless
-        ((time-$courserdatas{$cid.'.last_cache'})<240) {
-         my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.
-              ':resourcedata',$chome);
-         if ($reply!~/^error\:/) {
-            $courserdatas{$cid}=$reply;
-            $courserdatas{$cid.'.last_cache'}=time;
-         }
-      }
-      foreach (split(/\&/,$courserdatas{$cid})) {
-         my ($name,$value)=split(/\=/,$_);
-         $courseopt{$userprefix.&Apache::lonnet::unescape($name)}=
-                    &Apache::lonnet::unescape($value);
-      }
+	    unless ((time-$courserdatas{$cid.'.last_cache'})<240) {
+		my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.
+						 ':resourcedata',$chome);
+		if ($reply!~/^error\:/) {
+		    $courserdatas{$cid}=$reply;
+		    $courserdatas{$cid.'.last_cache'}=time;
+		}
+	    }
+	    foreach (split(/\&/,$courserdatas{$cid})) {
+		my ($name,$value)=split(/\=/,$_);
+		$courseopt{$userprefix.&Apache::lonnet::unescape($name)}=
+		    &Apache::lonnet::unescape($value);
+	    }
 # --------------------------------------------------- Get userdata (if present)
-      unless
-        ((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<240) {
-         my $reply=
-       &Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome);
-         if ($reply!~/^error\:/) {
-	     $userrdatas{$uname.'___'.$udom}=$reply;
-	     $userrdatas{$uname.'___'.$udom.'.last_cache'}=time;
-         }
-      }
-      foreach (split(/\&/,$userrdatas{$uname.'___'.$udom})) {
-         my ($name,$value)=split(/\=/,$_);
-         $useropt{$userprefix.&Apache::lonnet::unescape($name)}=
-	          &Apache::lonnet::unescape($value);
-      }
-    }
-
-                  @rows=();
-
-                  &tracetable(0,$firstres,'&'.$lastres.'&');
-                  if ($hash{'src_'.$lastres}) {
-                     my $brepriv=
-                        &Apache::lonnet::allowed('bre',$hash{'src_'.$lastres});
-                     if (($brepriv eq '2') || ($brepriv eq 'F')) {
-                        $rows[$#rows+1]=''.$lastres;
-		     }
-		  }
+	    unless ((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<240) {
+		my $reply=&Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome);
+		if ($reply!~/^error\:/) {
+		    $userrdatas{$uname.'___'.$udom}=$reply;
+		    $userrdatas{$uname.'___'.$udom.'.last_cache'}=time;
+		}
+	    }
+	    foreach (split(/\&/,$userrdatas{$uname.'___'.$udom})) {
+		my ($name,$value)=split(/\=/,$_);
+		$useropt{$userprefix.&Apache::lonnet::unescape($name)}=
+		    &Apache::lonnet::unescape($value);
+	    }
+	}
+
+	@rows=();
+
+	&tracetable(0,$firstres,'&'.$lastres.'&');
+	if ($hash{'src_'.$lastres}) {
+	    my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$lastres});
+	    if (($brepriv eq '2') || ($brepriv eq 'F')) {
+		$rows[$#rows+1]=''.$lastres;
+	    }
+	}
 
 # ------------------------------------------------------------------ Page parms
 
-                  my $j;
-                  my $i;
-                  my $lcm=1;
-                  my $contents=0;
+	my $j;
+	my $i;
+	my $lcm=1;
+	my $contents=0;
 
 # ---------------------------------------------- Go through table to get layout
 
-                  for ($i=0;$i<=$#rows;$i++) {
-		     if ($rows[$i]) {
-		      $contents++;
-                      my @colcont=split(/\&/,$rows[$i]);
-                      $lcm*=($#colcont+1)/euclid($lcm,($#colcont+1));
-                     } 
-                  }
+	for ($i=0;$i<=$#rows;$i++) {
+	    if ($rows[$i]) {
+		$contents++;
+		my @colcont=split(/\&/,$rows[$i]);
+		$lcm*=($#colcont+1)/euclid($lcm,($#colcont+1));
+	    } 
+	}
 
 
-                  unless ($contents) {
-                      $r->content_type('text/html');
-                      $r->send_http_header;
-                      $r->print('<html><body>Empty Map.</body></html>');
-                  } else {
+	unless ($contents) {
+	    $r->print('<html><body>Empty Map.</body></html>');
+	} else {
 
 # ------------------------------------------------------------------ Build page
 
-		      my $currenturl=$ENV{'form.postdata'};
-                      $currenturl=~s/^http\:\/\///;
-                      $currenturl=~s/^[^\/]+//;
+	    my $currenturl=$ENV{'form.postdata'};
+	    $currenturl=~s/^http\:\/\///;
+	    $currenturl=~s/^[^\/]+//;
 
 # ---------------------------------------------------------------- Send headers
 
-                          $r->content_type('text/html');
-                          &Apache::loncommon::no_cache($r);
-                          $r->send_http_header;
-
-		          my $date=localtime;
-		          my $now=time;
+	    my $date=localtime;
+	    my $now=time;
 # ----------------------------------------- Get email status and discussiontime
 
-		      my %emailstatus=&Apache::lonnet::dump('email_status');
-                      my $logouttime=$emailstatus{'logout'};
-                      my $courseleave=
-                         $emailstatus{'logout_'.$ENV{'request.course.id'}};
-                      my $lastcheck=
-                         ($courseleave>$logouttime?$courseleave:$logouttime);
-
-                      my %discussiontimes=&Apache::lonnet::dump(
-                         'discussiontimes',
-                         $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- 		         $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
-                       
-                      my %feedback=();
-                      my %error=();
-                      foreach my $msgid (
-                                     split(/\&/,&Apache::lonnet::reply('keys:'.
-					$ENV{'user.domain'}.':'.
-                                        $ENV{'user.name'}.':nohist_email',
-                                        $ENV{'user.home'}))) {
-                          $msgid=&Apache::lonnet::unescape($msgid);
-                          my $plain=&Apache::lonnet::unescape(
-                                    &Apache::lonnet::unescape($msgid));
-			  if ($plain=~/(Error|Feedback) \[([^\]]+)\]/) {
-			      my ($what,$url)=($1,$2);
-                              my %status=
-                                 &Apache::lonnet::get('email_status',[$msgid]);
-                              if ($status{$msgid}=~/^error\:/) { 
-                                 $status{$msgid}=''; 
-                              }
-
-			      if (($status{$msgid} eq 'new') || 
-                                  (!$status{$msgid})) { 
-                                  if ($what eq 'Error') {
-                                     $error{$url}.=','.$msgid; 
-				  } else {
-				      $feedback{$url}.=','.$msgid;
-                                  }
-                              }
-			  }
-		      }
+	    my %emailstatus=&Apache::lonnet::dump('email_status');
+	    my $logouttime=$emailstatus{'logout'};
+	    my $courseleave=$emailstatus{'logout_'.$ENV{'request.course.id'}};
+	    my $lastcheck=($courseleave>$logouttime?$courseleave:$logouttime);
+
+	    my %discussiontimes=&Apache::lonnet::dump('discussiontimes',
+							  $cdom,$cnum);
+
+	    my %feedback=();
+	    my %error=();
+	    foreach my $msgid (split(/\&/,&Apache::lonnet::reply('keys:'.
+								 $ENV{'user.domain'}.':'.
+								 $ENV{'user.name'}.':nohist_email',
+								 $ENV{'user.home'}))) {
+		$msgid=&Apache::lonnet::unescape($msgid);
+		my $plain=&Apache::lonnet::unescape(&Apache::lonnet::unescape($msgid));
+		if ($plain=~/(Error|Feedback) \[([^\]]+)\]/) {
+		    my ($what,$url)=($1,$2);
+		    my %status=
+			&Apache::lonnet::get('email_status',[$msgid]);
+		    if ($status{$msgid}=~/^error\:/) { 
+			$status{$msgid}=''; 
+		    }
+			
+		    if (($status{$msgid} eq 'new') || 
+			(!$status{$msgid})) { 
+			if ($what eq 'Error') {
+			    $error{$url}.=','.$msgid; 
+			} else {
+			    $feedback{$url}.=','.$msgid;
+			}
+		    }
+		}
+	    }
 # ----------------------------------------------------------- Start Page Output
-                          $r->print(
-		   '<html><head><title>Navigate LON-CAPA Maps</title></head>');
-			  $r->print('<body bgcolor="#FFFFFF"');
-                          if (($currenturl=~/^\/res/) &&
-                              ($currenturl!~/^\/res\/adm/)) {
-                             $r->print(' onLoad="window.location.hash='.
-				       "'curloc'".'"');
-			  }
-                          $r->print('><script>window.focus();</script>'.
-                           '<img align=right src=/adm/lonIcons/lonlogos.gif>'.
-                                    '<h1>Navigate Course Map</h1>'.
-                                    "<h3>$date</h3>");
-		      $r->rflush();
-                      $r->print(
- '<img src="/adm/lonMisc/chat.gif"> New discussion since '.
- localtime($lastcheck).
- '<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>'); 
-                      if (($currenturl=~/^\/res/) &&
-                          ($currenturl!~/^\/res\/adm/)) {
-		       $r->print('<a href="#curloc">Current Location</a><p>');
-                      }
+	    $r->print('<html><head><title>Navigate LON-CAPA Maps</title></head>');
+	    $r->print('<body bgcolor="#FFFFFF"');
+	    if (($currenturl=~/^\/res/) &&
+		($currenturl!~/^\/res\/adm/)) {
+		$r->print(' onLoad="window.location.hash='."'curloc'".'"');
+	    }
+	    $r->print('><script>window.focus();</script>'.
+		      '<img align=right src=/adm/lonIcons/lonlogos.gif>'.
+		      '<h1>Navigate Course Map</h1>'.
+		      "<h3>$date</h3>");
+	    $r->rflush();
+	    $r->print('<img src="/adm/lonMisc/chat.gif"> New discussion since '.
+		      localtime($lastcheck).
+		      '<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>'); 
+	    if (($currenturl=~/^\/res/) &&
+		($currenturl!~/^\/res\/adm/)) {
+		$r->print('<a href="#curloc">Current Location</a><p>');
+	    }
 # ----------------------------------------------------- The little content list
-                      for ($i=0;$i<=$#rows;$i++) {
-			if ($rows[$i]) {
-                          my @colcont=split(/\&/,$rows[$i]);
-                          my $avespan=$lcm/($#colcont+1);
-                          for ($j=0;$j<=$#colcont;$j++) {
-                              my $rid=$colcont[$j];
-                              if ($rid=~/^h(.+)/) {
-				  $rid=$1;
-                                  $r->print(
-     '&nbsp;&nbsp;&nbsp;<a href="#'.$rid.'">'.$hash{'title_'.$rid}.'</a><br>');
-                              }
-                          }
-		        }
-                      }
+	    for ($i=0;$i<=$#rows;$i++) {
+		if ($rows[$i]) {
+		    my @colcont=split(/\&/,$rows[$i]);
+		    my $avespan=$lcm/($#colcont+1);
+		    for ($j=0;$j<=$#colcont;$j++) {
+			my $rid=$colcont[$j];
+			if ($rid=~/^h(.+)/) {
+			    $rid=$1;
+			    $r->print('&nbsp;&nbsp;&nbsp;<a href="#'.
+				      $rid.'">'.$hash{'title_'.$rid}.
+				      '</a><br>');
+			}
+		    }
+		}
+	    }
 # ----------------------------------------------------------------- Start table
-                      $r->print('<hr><table cols="'.$lcm.'" border="0">');
-                      for ($i=0;$i<=$#rows;$i++) {
-			if ($rows[$i]) {
-                          $r->print("\n<tr>");
-                          my @colcont=split(/\&/,$rows[$i]);
-                          my $avespan=$lcm/($#colcont+1);
-                          for ($j=0;$j<=$#colcont;$j++) {
-                              my $rid=$colcont[$j];
-                              my $add='<td>&nbsp;&nbsp;';
-                              my $adde='</td>';
-                              my $hwk='<font color="#223322">';
-                              my $hwke='</font>';
-                              if ($rid=~/^h(.+)/) {
-				  $rid=$1;
-                                  $add=
-                                   '<th bgcolor="#AAFF55"><a name="'.$rid.'">';
-                                  $adde='</th>';
-                              }
-                            if ($rid=~/^p(\d)(\d)\"([\w\: \(\)\/\,]*)\"(.+)/) {
-				# sub astatus describes what code/tcode mean
-                                  my $code=$1;
-                                  my $tcode=$2;
-                                  my $ctext=$3;
-                                  $rid=$4;
-                                  if ($tcode eq '1') {
-                                     $add='<td bgcolor="#AAAAAA">';
-                                  }
-                                  if ($code eq '3') {
-                                     $add='<td bgcolor="#AAFFAA">';
-				  } else {
-                                      $add='<td bgcolor="#FFAAAA">';
-				      if ($tcode eq '2') {
-                                         $add='<td bgcolor="#FFFFAA">';
-                                      }
-                                      if ($tcode eq '4') {
-                                         $add='<td bgcolor="#FFFF33">';
-                                         $adde='</td>';
-                                      }
-                                  }
-                                  $hwk='<font color="#888811"><b>';
-                                  $hwke='</b></font>';
-                                  if ($code eq '1') {
-                                     $hwke='</b> ('.$ctext.')</font>';
-                                  }
-                                  if ($code eq '2') {
-                                     $hwk='<font color="#992222"><b>';
-                                     $hwke='</b> ('.$ctext.')</font>';
-                                  }
-                                  if ($code eq '3') {
-                                     $hwk='<font color="#229922"><b>';
-                                     $hwke='</b> ('.$ctext.')</font>';
-                                  }
-                              }
-			      if ($hash{'src_'.$rid} eq $currenturl) {
-                                  $add=$add.'<a name="curloc"></a>'.
-			  '<font color=red size=+2><b>&gt; </b></font>';
-                                  $adde=
-                          '<font color=red size=+2><b> &lt;</b></font>'.$adde;
-                              }
-                              my $src=
-                                &Apache::lonnet::declutter($hash{'src_'.$rid});
-                              $rid=~/^(\d+)\.(\d+)$/;
-			      my $symb=
-           &Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'.$src;
-                              if ($discussiontimes{$symb}>$lastcheck) {
-                                 $adde=
-                                 '<img border=0 src="/adm/lonMisc/chat.gif">'.
-				     $adde;
-                              }
-                              if ($error{$src}) {
-				  foreach (split(/\,/,$error{$src})) {
-			             if ($_) {
-                                        $adde=
-			 '&nbsp;<a href="/adm/email?display='.
-                         &Apache::lonnet::escape($_).
-                         '"><img src="/adm/lonMisc/bomb.gif" border=0></a>'
-                                        .$adde;
-                                     }
-			          }
-                              }
-                              if ($feedback{$src}) {
-				  foreach (split(/\,/,$feedback{$src})) {
-			             if ($_) {
-                                        $adde=
-			 '&nbsp;<a href="/adm/email?display='.
-                         &Apache::lonnet::escape($_).
-                         '"><img src="/adm/lonMisc/feedback.gif" border=0></a>'
-                                        .$adde;
-                                     }
-			          }
-                              }
-                              $r->print($add.'<a href="'.$hash{'src_'.$rid}.
-                                '">'.$hwk.
-                                $hash{'title_'.$rid}.$hwke.'</a>'.$adde);
-                          }
-                          $r->print('</tr>');
-		        }
-                      }
-                      $r->print("\n</table>");
-                      $r->print('</body></html>');
+	    $r->print('<hr><table cols="'.$lcm.'" border="0">');
+	    for ($i=0;$i<=$#rows;$i++) {
+		if ($rows[$i]) {
+		    $r->print("\n<tr>");
+		    my @colcont=split(/\&/,$rows[$i]);
+		    my $avespan=$lcm/($#colcont+1);
+		    for ($j=0;$j<=$#colcont;$j++) {
+			my $rid=$colcont[$j];
+			my $add='<td>&nbsp;&nbsp;';
+			my $adde='</td>';
+			my $hwk='<font color="#223322">';
+			my $hwke='</font>';
+			if ($rid=~/^h(.+)/) {
+			    $rid=$1;
+			    $add='<th bgcolor="#AAFF55"><a name="'.$rid.'">';
+			    $adde='</th>';
+			}
+			if ($rid=~/^p(\d)(\d)\"([\w\: \(\)\/\,]*)\"(.+)/) {
+			    # sub astatus describes what code/tcode mean
+			    my $code=$1;
+			    my $tcode=$2;
+			    my $ctext=$3;
+			    $rid=$4;
+			    if ($tcode eq '1') {
+				$add='<td bgcolor="#AAAAAA">';
+			    }
+			    if ($code eq '3') {
+				$add='<td bgcolor="#AAFFAA">';
+			    } else {
+				$add='<td bgcolor="#FFAAAA">';
+				if ($tcode eq '2') {
+				    $add='<td bgcolor="#FFFFAA">';
+				}
+				if ($tcode eq '4') {
+				    $add='<td bgcolor="#FFFF33">';
+				    $adde='</td>';
+				}
+			    }
+			    $hwk='<font color="#888811"><b>';
+			    $hwke='</b></font>';
+			    if ($code eq '1') {
+				$hwke='</b> ('.$ctext.')</font>';
+			    }
+			    if ($code eq '2') {
+				$hwk='<font color="#992222"><b>';
+				$hwke='</b> ('.$ctext.')</font>';
+			    }
+			    if ($code eq '3') {
+				$hwk='<font color="#229922"><b>';
+				$hwke='</b> ('.$ctext.')</font>';
+			    }
+			}
+			if ($hash{'src_'.$rid} eq $currenturl) {
+			    $add=$add.'<a name="curloc"></a>'.
+				'<font color=red size=+2><b>&gt; </b></font>';
+			    $adde=
+				'<font color=red size=+2><b> &lt;</b></font>'.$adde;
+			}
+			my $src=
+			    &Apache::lonnet::declutter($hash{'src_'.$rid});
+			$rid=~/^(\d+)\.(\d+)$/;
+			my $symb=
+			    &Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'.$src;
+			if ($discussiontimes{$symb}>$lastcheck) {
+			    $adde=
+				'<img border=0 src="/adm/lonMisc/chat.gif">'.
+				    $adde;
+			}
+			if ($error{$src}) {
+			    foreach (split(/\,/,$error{$src})) {
+				if ($_) {
+				    $adde=
+					'&nbsp;<a href="/adm/email?display='.
+					    &Apache::lonnet::escape($_).
+						'"><img src="/adm/lonMisc/bomb.gif" border=0></a>'
+						    .$adde;
+				}
+			    }
+			}
+			if ($feedback{$src}) {
+			    foreach (split(/\,/,$feedback{$src})) {
+				if ($_) {
+				    $adde=
+					'&nbsp;<a href="/adm/email?display='.
+					    &Apache::lonnet::escape($_).
+						'"><img src="/adm/lonMisc/feedback.gif" border=0></a>'
+						    .$adde;
+				}
+			    }
+			}
+			$r->print($add.'<a href="'.$hash{'src_'.$rid}.
+				  '">'.$hwk.
+				  $hash{'title_'.$rid}.$hwke.'</a>'.$adde);
+		    }
+		    $r->print('</tr>');
+		}
+	    }
+	    $r->print("\n</table>");
+	    $r->print('</body></html>');
 # -------------------------------------------------------------------- End page
-                  }                  
+	}                  
 # ------------------------------------------------------------- End render page
-              } else {
-                  $r->content_type('text/html');
-                  $r->send_http_header;
-		  $r->print('<html><body>Coursemap undefined.</body></html>');
-              }
+    }
 # ------------------------------------------------------------------ Untie hash
-              unless (untie(%hash)) {
-                   &Apache::lonnet::logthis("<font color=blue>WARNING: ".
-                       "Could not untie coursemap $fn (browse).</font>"); 
-              }
-              unless (untie(%parmhash)) {
-                   &Apache::lonnet::logthis("<font color=blue>WARNING: ".
-                       "Could not untie parmhash (browse).</font>"); 
-              }
-# -------------------------------------------------------------------- All done
-	      return OK;
-# ----------------------------------------------- Errors, hash could no be tied
-          }
-      } 
-  }
-
-  $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
-  return HTTP_NOT_ACCEPTABLE; 
+    unless (untie(%hash)) {
+	&Apache::lonnet::logthis("<font color=blue>WARNING: ".
+				 "Could not untie coursemap $fn (browse).</font>"); 
+    }
+    unless (untie(%parmhash)) {
+	&Apache::lonnet::logthis("<font color=blue>WARNING: ".
+				 "Could not untie parmhash (browse).</font>"); 
+    }
+    return OK;
 }
 
 1;

--albertel1016209870--