--- loncom/xml/londefdef.pm	2008/04/28 10:52:33	1.385
+++ loncom/xml/londefdef.pm	2009/01/20 12:01:00	1.398
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.385 2008/04/28 10:52:33 foxr Exp $
+# $Id: londefdef.pm,v 1.398 2009/01/20 12:01:00 foxr Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -42,10 +42,12 @@ package Apache::londefdef;
 use Apache::lonnet;
 use strict;
 use Apache::lonxml;
+use Apache::lontable;
 use Apache::File();
 use Image::Magick;
 use Apache::lonmenu();
 use Apache::lonmeta();
+use Apache::lonlocal;
 use Apache::Constants qw(:common);
 use File::Basename;
 use LONCAPA();
@@ -57,20 +59,7 @@ BEGIN {
 
 }
 
-#
-#   Dumps all elements of the table structure.
-#   Need this 'cause evidently when given an array, Data::Dumper only seems
-#   to dump element 0.
-#
-#sub debug_dump_table {
-#    my $lastrow = $#Apache::londefdef::table;
-#    &Apache::lonnet::logthis("Dumping table:  Last row index: $lastrow");
-#    my $row;
-#    for ($row =0; $row <= $lastrow; $row++ ) {
-#	my $text = Dumper($Apache::londefdef::table[$row]);
-#	&Apache::lonnet::logthis("table [ $row ]".$text);
-#    }
-#}
+
 sub initialize_londefdef {
     $Apache::londefdef::TD_redirection=0;
     @Apache::londefdef::table = ();
@@ -106,13 +95,13 @@ sub start_m {
 	my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval);
 	if ($eval eq 'on') {
 	    $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);
-	    #&Apache::lonxml::debug("M is evaulated to:$inside:");
+	    #&Apache::lonxml::debug("M is evaluated to:$inside:");
 	}
 	my $tex = $inside;
 	my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
 	$currentstring = &Apache::lontexconvert::converted(\$inside,$display);
 	if ($Apache::lontexconvert::errorstring) {
-	    my $errormsg='<pre>'.&HTML::Entities::encode($Apache::lontexconvert::errorstring,'<>&"').'</pre> occured while attempting to convert this TeX: <pre>';
+	    my $errormsg='<pre>'.&HTML::Entities::encode($Apache::lontexconvert::errorstring,'<>&"').'</pre> occurred while attempting to convert this TeX: <pre>';
 	    $tex = &HTML::Entities::encode($tex,'<>&"');
 	    my ($linenumber) =
 		($Apache::lontexconvert::errorstring =~ /Line (\d+)/);
@@ -138,7 +127,7 @@ sub start_m {
 	# detect simple math mode entry exits, and convert them
         # to use \ensuremath ... unless there's a \verb inside.
 	if (! ($currentstring=~/\\verb/)) {
-	    if ($currentstring=~/^\s*\$[^\$].*[^\$]\$\s*$/) {
+	    if ($currentstring=~/^\s*\$[^\$].*\$\s*$/) {
 		$currentstring=~s/^(\s*)\$/$1/;
 		$currentstring=~s/\$(\s*)$/$1/;
 		$currentstring='\ensuremath{'.$currentstring.'}';
@@ -200,17 +189,33 @@ sub start_html {
                           '\usepackage[dvips]{graphicx}'.
 			  '\usepackage{wrapfig}'.
 			  '\usepackage{picins}'.
-			  '\usepackage[utf8]{inputenc}'."\n".
 			  '\usepackage[T1]{fontenc}'."\n".
+                          '\usepackage{lmodern}'."\n".
+			  '\usepackage[postscript]{ucs}'."\n".
+			  '\usepackage[utf8x]{inputenc}'."\n".
+			  '\usepackage{pifont}' ."\n".
 			  '\usepackage{latexsym}'."\n".
                           '\usepackage{epsfig}'.
+			  "\\usepackage{xtab}\n".
+			  "\\usepackage{tabularx}\n".
+			  "\\usepackage{booktabs}\n".
+			  "\\usepackage{array}\n".
+			  "\\usepackage{colortbl}\n".
+			  "\\usepackage{xcolor}\n".
                           '\usepackage{calc}'.
                           '\usepackage{amsmath}'.
                           '\usepackage{amssymb}'.
                           '\usepackage{amsfonts}'.
                           '\usepackage{amsthm}'.
-                          '\usepackage{amscd}'.
-                          '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'.
+                          '\usepackage{amscd}';
+
+        if($env{'form.pdfFormFields'} eq 'yes') {
+            $currentstring .= '\usepackage{hyperref}'.
+                              '\usepackage{eforms}'.
+                              '\usepackage{tabularx}';
+        } 
+
+        $currentstring .= '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'.
                           '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}';
     }
     return $currentstring;
@@ -592,12 +597,16 @@ sub start_body {
 }
 
 sub edit_controls {
-    my $result .= (<<EDITBUTTON);
+    my $result .= '
 <form method="post">
-<input type="submit" name="editmode" accesskey="e" value="Edit" />
+<div class="LC_edit_problem_header">
+<div class="LC_edit_problem_header_row1">'.
+&Apache::lonxml::renderingoptions().'
+<input type="submit" name="changeproblemmode" value="'.&mt('Change View').'" />
+</div>
+<div class="LC_edit_problem_header_edit_row"><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" /></div></div>
 </form>
-<br />
-EDITBUTTON
+<br />';
     return $result;
 }
 
@@ -2003,7 +2012,8 @@ sub end_dd {
 #               only way I could think of to allow <p> in 
 #               <tr> <th> bodies
 #
-#list of supported attributes: border,width,TeXwidth
+#list of supported attributes: border,width,TeXwidth,TeXtheme
+#                              align
 sub start_table {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $textwidth = '';
@@ -2011,6 +2021,60 @@ sub start_table {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring .= $token->[4];     
     } 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);
+	my $width  = &Apache::lonxml::get_param('TeXwidth', $parstack, $safeeval, undef, 0);
+	my $theme  = &Apache::lonxml::get_param('TeXtheme', $parstack, $safeeval, undef, 0);
+	my $align  = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 0);
+
+	# The only thing that needs any figuring out is the width.. and then only if it is
+	# a percent. If not it's assumed to be some valid TeX measurement unit e.g. 3.0cm
+	#
+
+	my $table = new Apache::lontable();
+	if ($border ne '') {
+	    $table->table_border(1);
+	    $table->cell_border(1);
+	}
+	if ($theme ne '') {
+	    $table->theme($theme);
+	}
+	if ($align ne '') {
+	    $table->alignment($align);
+	}
+
+	# Missing width is most of page width
+
+	if ($width eq "") {
+	    $width = '70%';
+	}
+	
+	# If a percentage, need to calculate what this means in terms of
+	# page width:
+	
+	if ($width =~ /%$/) {
+	    my $textwidth = &recalc($env{'form.textwidth'});  # Page width in mm.
+	    $width =~ s/%//;
+	    $width = $width * $textwidth / 100.0;
+	    $width .= " mm";
+	    $table->width($width);
+	}
+
+	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)
@@ -2085,7 +2149,7 @@ sub start_table {
         $Apache::londefdef::table[-1]{'content'}=[];
         $Apache::londefdef::table[-1]{'align'}=[];
         $currentstring.=' \keephidden{NEW TABLE ENTRY}';
-
+    }
 
     }
     return $currentstring;
@@ -2097,6 +2161,20 @@ sub end_table {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
+
+
+	#  New table code:
+
+	my $table = pop(@Apache::londefdef::table);
+	my $t     = $table->generate();
+	$currentstring = $t->generate_string();
+	&enable_para();
+	#--------------------------------------------------------------
+	#  Old table code:
+	#--------------------------------------------------------------
+
+	if (0) {
+
 	my $border =  &Apache::lonxml::get_param('border',$parstack,$safeeval);
 	my $inmemory = '';
 	my $output = '';
@@ -2509,6 +2587,8 @@ sub end_table {
 	    pop @Apache::londefdef::table;
 	    undef @Apache::londefdef::table;
 	}
+	}
+	&enable_para();
     }
     }
     return $currentstring;
@@ -2521,6 +2601,19 @@ sub start_tr {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
+
+	my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);
+	$Apache::londefdef::table[-1]->start_row();
+	
+	if ($align ne '') {
+	    $Apache::londefdef::table[-1]->configure_row({default_halign => $align});
+	}
+
+	#---------------------------------------------------------------
+	# Old table code.
+	#---------------------------------------------------------------
+
+	if (0) {
 	$Apache::londefdef::table[-1]{'row_number'}++;
 	my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
 	if ($alignchar ne '') {
@@ -2539,6 +2632,7 @@ sub start_tr {
 	push @ {$Apache::londefdef::table[-1]{'minlen'}}, [];
 	push @ {$Apache::londefdef::table[-1]{'maxlen'}}, [];
 	push @ {$Apache::londefdef::table[-1]{'content'}}, [];
+    }
     } 
     return $currentstring;
 }
@@ -2549,6 +2643,19 @@ sub end_tr {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring .= $token->[2];     
     } elsif ($target eq 'tex') {
+
+	# In case the user is missing a </td> or </th> tag:
+
+	if ($Apache::londefdef::TD_redirection) {
+	    &end_td_tex($parstack,$parser,$safeeval);    
+	}
+	$Apache::londefdef::table[-1]->end_row();
+
+	#-----------------------------------------------
+	# Old table code
+	#-----------------------------------------------
+
+	if (0) {
 	if ($Apache::londefdef::TD_redirection) {
 	    &end_td_tex($parstack,$parser,$safeeval);    
 	}
@@ -2557,7 +2664,7 @@ sub end_tr {
 	if ($Apache::londefdef::table[-1]{'prior_columns'} > $Apache::londefdef::table[-1]{'counter_columns'}) {
 	    $Apache::londefdef::table[-1]{'counter_columns'} = $Apache::londefdef::table[-1]{'prior_columns'};
 	}
-
+    }
 
 	
     }
@@ -2593,9 +2700,50 @@ sub tag_check {
     }
     return '';
 }
+
+#
+#  Factor out cell configuration hash generation:
+#
+
+sub cell_config_hash {
+    my ($align, $rowspan, $colspan) = @_;
+    my %config;
+    if ($align ne '') {
+	$config{'halign'} = $align;
+    }
+    if ($colspan ne "") {
+	$config{'colspan'} = $colspan;
+    }
+    if ($rowspan ne '') {
+	$config{'rowspan'} = $rowspan;
+    }
+    return \%config;
+}
  
 sub start_td_tex {
     my ($parstack,$parser,$safeeval) = @_;
+
+    # At this stage, an empty cell is created with the
+    # appropriate rowspan/colspan and alignment
+    # attributes, but empty of text.  end_td_tex will
+    # fetch the contents from the recursive parse and
+    # fill the cell with them:
+    my $align   = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);
+    my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 1);
+    my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 1);
+
+    my $config = &cell_config_hash($align, $rowspan, $colspan);
+
+    my $table = $Apache::londefdef::table[-1];
+    $table->add_cell('', $config);
+    
+
+    #------------------------------------------------
+    #  Old table code.
+    #------------------------------------------------
+
+    if (0) {
+
     my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
     if ($alignchar eq '') {
 	$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1];
@@ -2608,11 +2756,22 @@ sub start_td_tex {
 	$current_length=~/(\d+\.?\d*)/;
 	push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1;
     }
+    }
     &Apache::lonxml::startredirection();
     return '';
 }
 
 sub end_td_tex {
+
+    my $text = &Apache::lonxml::endredirection();
+    my $table = $Apache::londefdef::table[-1];
+    $table->append_cell_text($text);
+
+    #-------------------------------------------------
+    # Old table code
+    #-------------------------------------------------
+
+    if (0) {
     my ($parstack,$parser,$safeeval) = @_;
     my $current_row    = $Apache::londefdef::table[-1]{'row_number'};
     my $current_column = $Apache::londefdef::table[-1]{'counter_columns'}; 
@@ -2777,7 +2936,7 @@ sub end_td_tex {
 	
     }
 
-
+    }
 
     return '';
 }
@@ -2826,6 +2985,24 @@ sub tagg_check {
  
 sub start_th_tex {
     my ($parstack,$parser,$safeeval) = @_;
+
+    my $alignment = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef,1);
+    my $rowspan  =  &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 1);
+    my $colspan  =  &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 1);
+
+    my $config   = cell_config_hash($alignment, $rowspan, $colspan);
+    my $table    = $Apache::londefdef::table[-1];
+    $table->add_cell('\textbf{', $config);
+
+    #-------------------------------------------------------------------------------------
+    #
+    #  Old table code.
+    #
+    #--------------------------------------------------------------------------------------
+
+    if (0) {
+
+
     my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
     if ($alignchar eq '') {
 	$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1];
@@ -2838,12 +3015,26 @@ sub start_th_tex {
 	$current_length=~/(\d+\.?\d*)/;
 	push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1;
     }
+    }
+
+    # Accept xml until the </th> tag.
+
     &Apache::lonxml::startredirection();
     return '';
 }
 
 sub end_th_tex {
     my ($parstack,$parser,$safeeval) = @_;
+
+    my $table = $Apache::londefdef::table[-1];
+    my $text  = &Apache::lonxml::endredirection();
+    $table->append_cell_text($text.'}');
+
+    #-----------------------------------------------------------------------------
+    #  Old table code:
+    #-----------------------------------------------------------------------------
+
+    if (0) {
     my $current_row = $Apache::londefdef::table[-1]{'row_number'};
     my $data=&Apache::lonxml::endredirection();
     my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
@@ -2908,6 +3099,7 @@ sub end_th_tex {
     #make data bold
     $data='\textbf{'.$data.'}';
     push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data;
+    }
     return'';
 }
 
@@ -3009,7 +3201,7 @@ sub start_img {
 
 	# &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
 
-	#if original gif/jpg/png file exist do following:
+	#if original bmp/gif/jpg/png file exist do following:
 	my $origsrc=$src;
 	my ($path,$file) = &get_eps_image($src);
 	# &Apache::lonnet::logthis("Image source: $src result: $path $file");
@@ -4287,27 +4479,9 @@ sub image_replication {
     }
     return '';
 }
-#
-#   Get correct sizing parameter for an image given
-#   it's initial ht. and wid.  This allows sizing of
-#   images that are generated on-the-fly (e.g. gnuplot)
-#   as well as serving as a utility for image_size.
-# 
-#  Parameter:
-#        height_param
-#        width_param    - Initial picture dimensions.
-#        scaling        - A scale factor.
-#        parstack,      - the current stack of tag attributes 
-#                         from the xml parser
-#        safeeval,      - pointer to the safespace
-#        depth,         - from what level in the stack to look for attributes
-#                         (assumes -1 if unspecified)
-#        cis            - look for attrubutes case insensitively
-#                         (assumes false)
-#
-# Returns:
-#   height, width   - new dimensions.
-#
+
+
+
 sub resize_image {
     my ($height_param, $width_param, $scaling,
 	$parstack, $safeeval, $depth, $cis) = @_;
@@ -4410,8 +4584,8 @@ sub get_eps_image {
 	&Apache::lonnet::repcopy($orig_src); # Failure is not completely fatal.
     }
     &Apache::lonxml::debug("get_eps_image: Original image: $orig_src");
-    my ($spath, $sname, $sext) = &fileparse($src, qr/\.(gif|png|jpg|jpeg)/i);
-    $src=~s/\.(gif|png|jpg|jpeg)$/\.eps/i;
+    my ($spath, $sname, $sext) = &fileparse($src, qr/\.(bmp|gif|png|jpg|jpeg)/i);
+    $src=~s/\.(bmp|gif|png|jpg|jpeg)$/\.eps/i;
     $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
     &Apache::lonxml::debug("Filelocation gives: $src");
     if (! -e $src) {
@@ -4472,7 +4646,7 @@ sub eps_generation {
     my $temp_file = Apache::File->new('>>'.$filename); 
     print $temp_file "$src\n";
     my $newsrc = $src;
-    $newsrc =~ s/(\.gif|\.jpg|\.jpeg)$/\.eps/i;
+    $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{/\./}{/};
@@ -4497,11 +4671,8 @@ sub file_path {
     } 
     return $file,$path;
 }
-#  Converts a measurement in to mm from any of 
-#  the other valid LaTeX units of measure.
-#  If the units of measure are missing from the 
-#  parameter, it is assumed to be in and returned
-#  with mm units of measure
+
+
 sub recalc {
     my $argument = shift;
     if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';}
@@ -4545,19 +4716,7 @@ sub LATEX_length {
     return $value;
 }
 
-#   Wrap image 'stuff' inside of the LaTeX required to implement 
-#   alignment:
-#     align_tex_image(align, latex_rendering, image)
-#   Where:
-#     align   - The HTML alignment specification.
-#     latex_rendering - rendering hint for latex.
-#     image   - The LaTeX needed to insert the image itsef.
-#     width,height - dimensions of the image.
-# Returns:
-#    The 1/2 wrapped image and the stuff required to close the
-#    wrappage.  This allows e.g. randomlabel to insert more stuff
-#    into the closure.
-#
+
 sub align_latex_image {
     my ($align, $latex_rendering, $image, $width, $height) = @_;
     my $currentstring;        # The 1/2 wrapped image.
@@ -4624,16 +4783,7 @@ sub align_latex_image {
     return ($currentstring, $closure);
 }
 
-# is_inside_of $tagstack $tag
-#    This sub returns true if the current state of Xml processing
-#    is inside of the tag.   
-# Parameters:
-#     tagstack   - The tagstack from the parser.
-#     tag        - The tag (without the <>'s.).
-# Sample usage:
-#     if (is_inside_of($tagstack "table")) {
-#          # I'm in a table....
-#      }
+
 sub is_inside_of {
     my ($tagstack, $tag) = @_;
     my @stack = @$tagstack;
@@ -4646,5 +4796,106 @@ sub is_inside_of {
 }
 
 
+=pod
+
+=head1 NAME
+
+Apache::londefdef.pm
+
+=head1 SYNOPSIS
+
+Tags Default Definition Module
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+
+=head1 NOTABLE SUBROUTINES
+
+=over
+
+=item start_hideweboutput()
+
+=item end_hideweboutput()
+
+=item image_replication()
+
+=item resize_image()
+
+	Get correct sizing parameter for an image given
+	it's initial ht. and wid.  This allows sizing of
+	images that are generated on-the-fly (e.g. gnuplot)
+	as well as serving as a utility for image_size.
+ 
+	Parameter:
+        height_param
+        width_param    - Initial picture dimensions.
+        scaling        - A scale factor.
+        parstack,      - the current stack of tag attributes 
+                         from the xml parser
+        safeeval,      - pointer to the safespace
+        depth,         - from what level in the stack to look for attributes
+                         (assumes -1 if unspecified)
+        cis            - look for attrubutes case insensitively
+                         (assumes false)
+
+	Returns:
+		height, width   - new dimensions.
+
+=item image_size()
+
+=item image_width()
+
+=item image_height()
+
+=item get_eps_image()
+
+=item eps_generation()
+
+=item file_path()
+
+=item recalc()
+
+	Converts a measurement in to mm from any of 
+	the other valid LaTeX units of measure.
+	If the units of measure are missing from the 
+	parameter, it is assumed to be in and returned
+	with mm units of measure
+
+=item LATEX_length()
+
+=item align_latex_image()
+
+  	Wrap image 'stuff' inside of the LaTeX required to implement 
+   	alignment:
+     	align_tex_image(align, latex_rendering, image)
+   	Where:
+     	align   - The HTML alignment specification.
+     	latex_rendering - rendering hint for latex.
+     	image   - The LaTeX needed to insert the image itsef.
+     	width,height - dimensions of the image.
+ 	Returns:
+    	The 1/2 wrapped image and the stuff required to close the
+    	wrappage.  This allows e.g. randomlabel to insert more stuff
+    	into the closure.
+
+
+=item is_inside_of($tagstack, $tag)
+   	This sub returns true if the current state of Xml processing is inside of the tag.   
+	Parameters:
+    	tagstack   - The tagstack from the parser.
+    	tag        - The tag (without the <>'s.).
+	Sample usage:
+    	if (is_inside_of($tagstack "table")) {
+     	   I'm in a table....
+     	}
+
+
+
+=back
+
+=cut
+
+
 1;
 __END__