--- loncom/xml/londefdef.pm	2011/04/05 10:02:57	1.428
+++ loncom/xml/londefdef.pm	2013/01/04 05:30:52	1.442
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.428 2011/04/05 10:02:57 foxr Exp $
+# $Id: londefdef.pm,v 1.442 2013/01/04 05:30:52 raeburn Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -55,7 +55,7 @@ use LONCAPA();
 
 BEGIN {
 
-    &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput'));
+    &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','style','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput'));
 
 }
 
@@ -383,6 +383,9 @@ sub start_meta {
 	} else {
 	    $currentstring = $token->[4];
 	}
+        if ($env{'form.grade_imsexport'}) {
+            $currentstring = '';
+        }
     } elsif ($target eq 'meta') {
 	unless (&Apache::lonxml::get_param
 		('http-equiv',$parstack,$safeeval,undef,1)) {
@@ -455,6 +458,32 @@ sub insert_meta {
     <meta />';
 }
 
+#-- <start> tag
+sub start_style {
+	my ($target, $token, $tagstack, $parstack, $parser, $safeeval, $style) = @_;
+	my $currentstring = '';
+
+	if ($target eq 'tex') {
+		Apache::lonxml::startredirection();
+	} else {
+		$currentstring = $token->[4];
+	}
+	
+	return $currentstring;
+}
+
+sub end_style {
+	my ($target, $token, $tagstack, $parstack, $parser, $safeeval) = @_;
+	my $currentstring = '';
+
+	if ($target eq 'tex') {
+		Apache::lonxml::endredirection();
+	} else {
+		$currentstring = $token->[2];
+	}
+	return $currentstring;
+}
+
 # accessrule
 sub start_accessrule {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
@@ -541,9 +570,10 @@ sub start_body {
     # Breadcrumbs
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     if ($env{'request.state'} eq 'construct') {
+        my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'});
         &Apache::lonhtmlcommon::add_breadcrumb({
             'text'  => 'Construction Space',
-            'href'  => &Apache::loncommon::authorspace(),
+            'href'  => &Apache::loncommon::authorspace($url),
         });
         &Apache::lonhtmlcommon::add_breadcrumb({
             'text'  => 'HTML Editor',
@@ -569,7 +599,7 @@ sub start_body {
             $header=&Apache::lonmenu::constspaceform();
         }
         if ($env{'request.state'} ne 'published') {
-            $header.=&Apache::londefdef::edit_controls();
+            $header.=&edit_controls();
         }
         if ($env{'request.state'} eq 'construct') {
             $currentstring.=&Apache::loncommon::head_subbox(
@@ -601,12 +631,29 @@ sub edit_controls {
     $result .= '
 <div><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" />';
     if (($env{'request.course.id'}) && ($env{'form.forceedit'})) {
-        my $viewtext = &mt('Course View');
-        if (&Apache::loncommon::course_type() eq 'Community') {
-            $viewtext = &mt('Community View');
+        my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'});
+        if ($url =~ /\.html?$/i) {
+            if ($env{'request.course.id'}) {
+                if ($env{'request.filename'} =~ m{/userfiles/supplemental/default|\d+/}) {
+                    if (&Apache::lonnet::is_course_upload($env{'request.filename'},
+                        $env{'course.'.$env{'request.course.id'}.'.num'},
+                        $env{'course.'.$env{'request.course.id'}.'.domain'})) {
+                        &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+                                                                ['folderpath','title']);
+                    }
+                }
+            }
+            my ($symb,$itemtitle,$displayfile) = 
+                &Apache::lonxml::get_courseupload_hierarchy($url,
+                                                            $env{'form.folderpath'},
+                                                            $env{'form.title'});
+            if (($symb ne '') || ($env{'httpref.'.$url} ne '')) {
+                  $result .= ('&nbsp;' x 3).
+                             &Apache::lonhtmlcommon::dependencies_button()."\n".
+                             &Apache::lonhtmlcommon::dependencycheck_js($symb,
+                                 $itemtitle,$url,$env{'form.folderpath'},$url)."\n";
+            }
         }
-        $result .= ('&nbsp;' x 3).'<input type="button" value="'.
-                   $viewtext.'" onclick="javascript:location.href=currentURL" />';
     }
     $result .= '</div>
 </div>
@@ -2044,9 +2091,6 @@ sub start_table {
     } elsif ($target eq 'tex') {
 	&disable_para();	# Can't have paras in a table.
 
-
-	#  New table code:
-
 	#  Get the parameters that we can do something about:
 
 	my $border = &Apache::lonxml::get_param('border', $parstack, $safeeval, undef, 0);
@@ -2067,7 +2111,6 @@ sub start_table {
 		$table->cell_border(1); # Default for rules is all if rules not defined.
 	    }
 	}
-	# Only all or nothing for cell borders for now:
 
 	if ((defined $cell_border)) {
 	    if ($cell_border eq 'all') {
@@ -2076,6 +2119,8 @@ sub start_table {
 		$table->cell_border(2);
 	    } elsif ($cell_border eq 'cols') {
 		$table->cell_border(3);
+	    } elsif($cell_border eq 'groups') {
+		$table->cell_border(4);
 	    } else {
 		$table->cell_border(0);
 	    }
@@ -2107,88 +2152,6 @@ sub start_table {
 	push(@Apache::londefdef::table, $table);
         $currentstring.=' \keephidden{NEW TABLE ENTRY}';
 
-	#--------------------------------------------------------
-	#  Old table code here.
-	#--------------------------------------------------------
-
-
-	if (0) {
-	push(@Apache::londefdef::table, {}); 
-	$Apache::londefdef::table[-1]{'row_number'} = -1;
-        #maximum table's width (default coincides with text line length)
-	if ($#Apache::londefdef::table==0) {
-	    $textwidth=&recalc($env{'form.textwidth'}); #result is always in mm
-	    $textwidth=~/(\d+\.?\d*)/;
-	    $textwidth=0.85*$1; #accounts "internal" LaTeX space for table frame
-	} else {
-	    if ($Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]=~/\d/) {
-		#the maximum width of nested table is determined by LATeX width of parent cell
-		$textwidth=$Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]; 
-	    } else {
-              #try to use all space not used before (minus 5% for LaTeX table internal) - rather silly
-		$textwidth=$Apache::londefdef::table[-2]{'width'};
-		for (my $i=0;$i<$Apache::londefdef::table[-2]{'counter_columns'};$i++) {
-		    $textwidth=$textwidth-$Apache::londefdef::table[-2]{'TeXlen'}[0][$i];
-		}
-	    }
-	}
-
-	# width either comes forced from the TeXwidth or the width parameters.
-	# in either case it can be a percentage or absolute width.
-	# in the width case we ignore absolute width 
-	my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
-	if (!defined($TeXwidth)) {
-	    my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,
-						       $safeeval,undef,1);
-	    if ($htmlwidth =~ /%/) {
-		$TeXwidth = $htmlwidth;
-	    } else { 
-		$TeXwidth = $textwidth;
-	    }
-	}
-	# if the width is specified as a % it is converted to an absolute width.
-	# otherwise.. just plugged right in the hash
-
-	if ($TeXwidth=~/%/) {
-	    $TeXwidth=~/(\d+)/;
-            $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
-	} else {
-	    $Apache::londefdef::table[-1]{'width'}=$TeXwidth;
-	}
-        #  In the end, however the table width cannot be wider than $textwidth...
-	
-	if ($Apache::londefdef::table[-1]{'width'} > $textwidth) {
-	    $Apache::londefdef::table[-1]{'width'} = $textwidth;
-	}
-        #table's border
-	my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); 
-        my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);
-	unless (defined $border) { $border = 0; }
-	if ($border) { 
-	    $Apache::londefdef::table[-1]{'hinc'} = '\hline '; 
-	    $Apache::londefdef::table[-1]{'vinc'} = '&'; 
-	    $Apache::londefdef::table[-1]{'vvinc'} = '|';
-	} else {
-	    $Apache::londefdef::table[-1]{'hinc'} = ''; 
-	    $Apache::londefdef::table[-1]{'vinc'} = '&'; 
-	    $Apache::londefdef::table[-1]{'vvinc'} = '';
-	}
-	if ($#Apache::londefdef::table==0) {
-	    #    Note that \newline seems to destroy the alignment envs.
-	    # $Apache::londefdef::table[-1]{'output'}='\strut\newline\strut\setlength{\tabcolsep}{1 mm}';
-	    $Apache::londefdef::table[-1]{'output'}='\strut'.'\\\\'."\n".'\strut\setlength{\tabcolsep}{1 mm}';
-	}
-	$Apache::londefdef::table[-1]{'output'}.=' \noindent \begin{tabular} ';
-        $Apache::londefdef::table[-1]{'TeXlen'}=[];
-        $Apache::londefdef::table[-1]{'objectlen'}=[];
-        $Apache::londefdef::table[-1]{'objectsignal'}=[];
-        $Apache::londefdef::table[-1]{'maxlen'}=[];
-        $Apache::londefdef::table[-1]{'minlen'}=[];
-        $Apache::londefdef::table[-1]{'content'}=[];
-        $Apache::londefdef::table[-1]{'align'}=[];
-        $currentstring.=' \keephidden{NEW TABLE ENTRY}';
-    }
-
     }
     return $currentstring;
 }
@@ -2201,8 +2164,6 @@ sub end_table {
     } elsif ($target eq 'tex') {
 	
 	
-	#  New table code:
-	
 	my $table = pop(@Apache::londefdef::table);
 	my $t     = $table->generate();
 	# &Apache::lonnet::logthis("Generating string");
@@ -2967,10 +2928,7 @@ sub start_applet {
     &Apache::lonxml::extlink($archive);
     my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {
-        $currentstring = &Apache::lonenc::encrypt_ref($token,
-                                                      {'code'=>$code,
-                                                       'archive'=>$archive}
-                                                     );
+        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {
         # Turn off some stuff we can't be inside thank you LaTeX
 
@@ -3056,22 +3014,47 @@ sub end_embed {
 #-- <param> tag (end tag forbidden)
 sub start_param {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
-    if (&Apache::lonxml::get_param('name',$parstack,
-				   $safeeval,undef,1)=~/^cabbase$/i) {
+    my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval,
+                                          undef,1);
+    if ($name =~/^cabbase$/i) {
 	my $value=&Apache::lonxml::get_param('value',$parstack,
 					     $safeeval,undef,1);
 	&Apache::lonxml::extlink($value);
-    } 
-  
+    } elsif ($name eq 'flashvars') {
+        if (lc(&Apache::lonxml::get_param('type',$parstack,$safeeval,-2,1))
+            eq 'application/x-shockwave-flash') {
+            my $launcher =
+                &Apache::lonxml::get_param('data',$parstack,$safeeval,-2,1);
+            if ($launcher) {
+                &Apache::lonxml::extlink($launcher);
+            }
+            my $flashvars=&Apache::lonxml::get_param('value',$parstack,
+                                                     $safeeval,undef,1);
+            if ($flashvars ne '') {
+                foreach my $item (split(/\&/,$flashvars)) {
+                    my ($key,$value)=split(/=/,$item,2);
+                    if ($key eq 'content') {
+                        if ($value ne '') {
+                            my ($dir) = ($launcher =~ m{(.+/)[^/]+$});
+                            &Apache::lonxml::extlink($dir.$value);
+                        }
+                    } elsif ($key eq 'thumb') {
+                        if ($value ne '') {
+                            &Apache::lonxml::extlink($value);
+                        }
+                    }
+                }
+            }
+        }
+    }
     my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
-    &Apache::lonxml::extlink($src);
+    if ($src ne '') {
+        &Apache::lonxml::extlink($src);
+    }
     my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {
 	my %toconvert;
-	my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
 	if ($src) { $toconvert{'src'}= $src; }
-	my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval,
-					    undef,1);
 	if ($name=~/^cabbase$/i) {
 	    $toconvert{'value'}=&Apache::lonxml::get_param('value',$parstack,
 							   $safeeval,undef,1);
@@ -3468,13 +3451,34 @@ sub end_col {
     return $currentstring;
 }
 
-#-- <colgroup> tag (end tag optional)
+#-- <colgroup tag (end tag optional)
 sub start_colgroup {
-    my ($target,$token) = @_;
+    my ($target,$token,$tagstack, $parstack, $parser, $safeeval, $style) = @_;
     my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[4];     
     } 
+    if ($target eq 'tex') {
+	# TODO: Ensure this tag is in a table:
+
+	# Fetch the attributes and build the hash for the
+	# call to define_colgroup.
+
+	my $span    = &Apache::lonxml::get_param('span',   $parstack, $safeeval);
+	my $halign  = &Apache::lonxml::get_param('halign', $parstack, $safeeval);
+
+	my %colgroup_params;
+	if ($span ne '') {
+	    $colgroup_params{'span'} = $span;
+	}
+	if ($halign ne '') {
+	    $colgroup_params{'halign'} = $halign;
+	}
+	
+	my $table = $Apache::londefdef::table[-1];
+	$table->define_colgroup(\%colgroup_params);
+
+    }
     return $currentstring;
 }
 
@@ -3968,6 +3972,12 @@ sub start_tbody {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[4];     
     } 
+    if ($target eq 'tex') {
+	# TODO: Ensure this tag is within a table:
+
+	my $table = $Apache::londefdef::table[-1];
+	$table->start_body();
+    }
     return $currentstring;
 }
 
@@ -3977,6 +3987,12 @@ sub end_tbody {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[2];    
     } 
+    if($target eq 'tex') {
+	# TODO: Ensure this tag is within a table:
+
+	my $table = $Apache::londefdef::table[-1];
+	$table->end_body();
+    }
     return $currentstring;
 }
 
@@ -3987,6 +4003,11 @@ sub start_tfoot {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[4];     
     } 
+    if ($target eq 'tex') {
+        # TODO: ensure this is within a table tag.
+	my $table = $Apache::londefdef::table[-1];
+	$table->start_foot();
+    }
     return $currentstring;
 }
 
@@ -3996,6 +4017,11 @@ sub end_tfoot {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[2];    
     } 
+    if ($target eq 'tex') {
+	#  TODO: Ensure this is in side a table 
+	my $table = $Apache::londefdef::table[-1];
+	$table->end_foot();
+    }
     return $currentstring;
 }
 
@@ -4006,6 +4032,11 @@ sub start_thead {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[4];     
     } 
+    if ($target eq 'tex') {
+	# Assume we're in a table... TODO: Verify that and ignore tag if not.
+	my $table = $Apache::londefdef::table[-1];
+	$table->start_head();
+    }
     return $currentstring;
 }
 
@@ -4015,6 +4046,12 @@ sub end_thead {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[2];    
     } 
+    if ($target eq 'tex') {
+     	# TODO: Verify we are in a table and ignore tag if not.
+
+	my $table = $Apache::londefdef::table[-1];
+	$table->end_head();
+    }
     return $currentstring;
 }
 
@@ -4225,7 +4262,7 @@ sub get_eps_image {
 		    close(FILE);
                 }
 		$src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
-		$src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;
+		$src=~s|/home/httpd/html/priv/[^/]+/([^/]*)/|/home/httpd/prtspool/$1/|;
 		if ($sext ne "") {	 # Put the ext. back in to uniquify.
 		    $src =~ s/\.eps$/$sext.eps/;
 		}
@@ -4244,7 +4281,7 @@ sub get_eps_image {
 	print FILE "$src\n";
 	close FILE;
 	$src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
-	$src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;
+	$src=~s|/home/httpd/html/priv/[^/]+/([^/]*)/|/home/httpd/prtspool/$1/|;
     }
     my ($path,$file)=($src=~m|(.*)/([^/]*)$|);
     $path =~ s/ /\_/g;
@@ -4263,7 +4300,7 @@ sub eps_generation {
     my $newsrc = $src;
     $newsrc =~ s/(\.bmp|\.gif|\.jpg|\.jpeg)$/\.eps/i;
     $newsrc=~s{/home/httpd/html/res}{};
-    $newsrc=~s{/home/($LONCAPA::username_re)/public_html/}{/$1/};
+    $newsrc=~s{/home/httpd/html/priv/[^/]+/($LONCAPA::username_re)/}{/$1/};
     $newsrc=~s{/\./}{/};
     $newsrc=~s{/([^/]+)\.(ps|eps)}{/};
     if ($newsrc=~m{/home/httpd/lonUsers/}) {
@@ -4446,7 +4483,7 @@ sub latex_header {
 	"\\usepackage{xcolor}\n".
 	'\usepackage{calc}'.
 	'\usepackage{amsmath}'.
-    '\usepackage{soul}',
+	'\usepackage{soul}'.
 	'\usepackage{amssymb}'.
 	'\usepackage{amsfonts}'.
 	'\usepackage{amsthm}'.