[Bio] / SubsystemEditor / WebPage / ShowVariants.pm Repository:
ViewVC logotype

Annotation of /SubsystemEditor/WebPage/ShowVariants.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.13 - (view) (download) (as text)

1 : bartels 1.1 package SubsystemEditor::WebPage::ShowVariants;
2 :    
3 :     use strict;
4 :     use warnings;
5 :     use URI::Escape;
6 :     use HTML;
7 :     use Data::Dumper;
8 :    
9 :     use FIG;
10 :    
11 :     use base qw( WebPage );
12 :    
13 :     1;
14 :    
15 :     ##################################################
16 :     # Method for registering components etc. for the #
17 :     # application #
18 :     ##################################################
19 :     sub init {
20 :     my ( $self ) = @_;
21 :    
22 : bartels 1.8 $self->application->register_component( 'Table', 'ShowVariantsTable' );
23 :     $self->application->register_component( 'Table', 'FRTable' );
24 :     $self->application->register_component( 'Table', 'VarDescTable' );
25 :     $self->application->register_component( 'Info', 'CommentInfo');
26 : bartels 1.1 }
27 :    
28 :     sub require_javascript {
29 :    
30 :     return [ './Html/showfunctionalroles.js' ];
31 :    
32 :     }
33 :    
34 :     ##############################################
35 :     # Website content is returned by this method #
36 :     ##############################################
37 :     sub output {
38 :     my ( $self ) = @_;
39 :    
40 : bartels 1.5 my $can_alter = 0;
41 :     my $user = $self->application->session->user;
42 : bartels 1.1
43 : bartels 1.12 $self->{ 'fig' } = $self->application->data_handle( 'FIG' );
44 :     $self->{ 'cgi' } = $self->application->cgi;
45 : bartels 1.1
46 : bartels 1.12 my $name = $self->{ 'cgi' }->param( 'subsystem' );
47 : bartels 1.1 my $ssname = $name;
48 : bartels 1.8 $name = uri_unescape( $name );
49 : bartels 1.1 $ssname =~ s/\_/ /g;
50 :    
51 : bartels 1.7 my $esc_name = uri_escape($name);
52 :    
53 : paczian 1.11 my $dbmaster = $self->application->dbmaster;
54 :     my $ppoapplication = $self->application->backend;
55 : bartels 1.5
56 :     # get a seeduser #
57 :     my $seeduser = '';
58 :     if ( defined( $user ) && ref( $user ) ) {
59 :     my $preferences = $dbmaster->Preferences->get_objects( { user => $user,
60 :     name => 'SeedUser',
61 :     application => $ppoapplication } );
62 :     if ( defined( $preferences->[0] ) ) {
63 :     $seeduser = $preferences->[0]->value();
64 :     }
65 :     }
66 :    
67 :     if ( $user && $user->has_right( $self->application, 'edit', 'subsystem', $name ) ) {
68 :     $can_alter = 1;
69 : bartels 1.12 $self->{ 'fig' }->set_user( $seeduser );
70 : bartels 1.5 }
71 :    
72 : bartels 1.1 ######################
73 :     # Construct the menu #
74 :     ######################
75 :    
76 :     my $menu = $self->application->menu();
77 :    
78 :     # Build nice tab menu here
79 : bartels 1.7 $menu->add_category( 'Subsystem Info', "SubsysEditor.cgi?page=ShowSubsystem&subsystem=$esc_name" );
80 :     $menu->add_category( 'Functional Roles', "SubsysEditor.cgi?page=ShowFunctionalRoles&subsystem=$esc_name" );
81 : redwards 1.13 $menu->add_category( 'Diagrams and Illustrations' );
82 :     $menu->add_entry( 'Diagrams and Illustrations', 'Diagram', "SubsysEditor.cgi?page=ShowDiagram&subsystem=$esc_name" );
83 :     $menu->add_entry( 'Diagrams and Illustrations', 'Illustrations', "SubsysEditor.cgi?page=ShowIllustrations&subsystem=$esc_name" );
84 : bartels 1.7 $menu->add_category( 'Spreadsheet', "SubsysEditor.cgi?page=ShowSpreadsheet&subsystem=$esc_name" );
85 :     $menu->add_category( 'Show Check', "SubsysEditor.cgi?page=ShowCheck&subsystem=$esc_name" );
86 :     $menu->add_category( 'Show Connections', "SubsysEditor.cgi?page=ShowTree&subsystem=$esc_name" );
87 : bartels 1.1
88 :    
89 :     ##############################
90 :     # Construct the page content #
91 :     ##############################
92 :     my $comment;
93 :     my $error;
94 :    
95 :     my $content = "<H1>Variants for Subsystem: $ssname</H1>";
96 :    
97 :     if ( !defined( $name ) ) {
98 :     $content .= "<B>No subsystem given</B>";
99 :     return $content;
100 :     }
101 :    
102 : bartels 1.9 $content .= $self->start_form();
103 :    
104 :     #### 100x100 ####
105 : bartels 1.12 if ( defined( $self->{ 'cgi' }->param( 'on100x100' ) ) ) {
106 :     $self->{ 'cgi' }->param( 'hundred_hundred', 1 );
107 : bartels 1.9 }
108 : bartels 1.12 if ( defined( $self->{ 'cgi' }->param( 'off100x100' ) ) ) {
109 :     $self->{ 'cgi' }->param( 'hundred_hundred', 0 );
110 : bartels 1.9 }
111 :    
112 :    
113 : bartels 1.12 if ( !defined( $self->{ 'cgi' }->param( 'hundred_hundred' ) ) || $self->{ 'cgi' }->param( 'hundred_hundred' ) != 1 ) {
114 :     $content .= $self->{ 'cgi' }->submit( -name => "on100x100", -value => "Show only 100x100" );
115 : bartels 1.9 }
116 :     else {
117 : bartels 1.12 $content .= $self->{ 'cgi' }->submit( -name => "off100x100", -value => "Show all genomes" );
118 : bartels 1.9 }
119 :    
120 : bartels 1.12 my $subsystem = $self->{ 'fig' }->get_subsystem( $name );
121 : bartels 1.6
122 : bartels 1.12 my $datahash = $self->get_data( $subsystem );
123 : bartels 1.1
124 :     my $application = $self->application;
125 :    
126 : bartels 1.12 if ( $self->{ 'cgi' }->param( 'set_variants' ) ) {
127 : bartels 1.1 $comment .= '<BR>';
128 : bartels 1.12 $comment .= set_variants( $self, $name, $subsystem, $application, $datahash );
129 :     $datahash = $self->get_data( $subsystem );
130 : bartels 1.1 }
131 : bartels 1.12 elsif ( $self->{ 'cgi' }->param( 'addsave_variants' ) ) {
132 :     my @varcodes = $self->{ 'cgi' }->param( 'VARIANT' );
133 :     my @vardescs = $self->{ 'cgi' }->param( 'VARIANTDESC' );
134 : bartels 1.5 my %varhash;
135 :    
136 :     for ( my $i = 0; $i < scalar( @varcodes ); $i++ ) {
137 :    
138 :     if ( $varcodes[$i] eq '' ) {
139 :     if ( $vardescs[$i] ne '' ) {
140 : bartels 1.12 $comment .= "No Variant Code given for description ".uri_unescape( $vardescs[$i] ).", so this variant could not be saved.<BR>\n";
141 : bartels 1.5 }
142 :     next;
143 :     }
144 :     if ( defined( $varhash{ $varcodes[$i] } ) ) {
145 : bartels 1.12 $comment .= "Variant ".$varcodes[$i]." already has the description ".$varhash{ $varcodes[$i] }.", so description ".uri_unescape( $vardescs[$i] )." was ignored.<BR>\n";
146 : bartels 1.5 next;
147 :     }
148 : bartels 1.1
149 : bartels 1.12 $varhash{ $varcodes[$i] } = uri_unescape( $vardescs[$i] );
150 : bartels 1.5 }
151 : bartels 1.12 my $newvarcode = $self->{ 'cgi' }->param( 'NEWVARIANT' );
152 :     my $newvardesc = $self->{ 'cgi' }->param( 'NEWVARIANTDESC' );
153 : bartels 1.5 if ( defined( $newvarcode ) && $newvarcode ne '' && defined( $newvardesc ) && $newvardesc ne '' ) {
154 :     if ( $newvarcode eq '' ) {
155 :     if ( $newvarcode ne '' ) {
156 : bartels 1.12 $comment .= "No Variant Code given for description ".uri_unescape( $newvardesc ).", so this variant could not be saved.<BR>\n";
157 : bartels 1.5 }
158 :     }
159 :     elsif ( defined( $varhash{ $newvarcode } ) ) {
160 : bartels 1.12 $comment .= "Variant $newvarcode already has the description ".uri_unescape( $newvardesc ).", so description ".uri_unescape( $newvardesc )." was ignored.<BR>\n";
161 : bartels 1.5 }
162 :     else {
163 : bartels 1.12 $varhash{ $newvarcode } = uri_unescape( $newvardesc );
164 : bartels 1.5 }
165 :     }
166 :    
167 :     $subsystem->set_variants( \%varhash );
168 :     $subsystem->incr_version();
169 :     $subsystem->db_sync();
170 :     $subsystem->write_subsystem();
171 :     }
172 :    
173 : bartels 1.8 if ( defined( $comment ) && $comment ne '' ) {
174 :     my $info_component = $application->component( 'CommentInfo' );
175 :    
176 :     $info_component->content( $comment );
177 :     $info_component->default( 0 );
178 :     $content .= $info_component->output();
179 :     }
180 :    
181 : bartels 1.9
182 : bartels 1.12 $content .= show_variants( $self, $name, $subsystem, $can_alter, $datahash );
183 : bartels 1.1
184 :     ###############################
185 :     # Display errors and comments #
186 :     ###############################
187 :    
188 :     if ( defined( $error ) && $error ne '' ) {
189 :     $self->application->add_message( 'warning', $error );
190 :     }
191 :     return $content;
192 :     }
193 :    
194 : bartels 1.2 ###############
195 :     # data method #
196 :     ###############
197 : bartels 1.1 sub get_data {
198 : bartels 1.12 my ( $self, $subsystem ) = @_;
199 : bartels 1.1
200 :     my $datahash = {};
201 :    
202 : bartels 1.12 my @genomes = $subsystem->get_genomes;
203 : bartels 1.9
204 :     my %thesegenomes;
205 :    
206 : bartels 1.12 if ( defined( $self->{ 'cgi' }->param( 'hundred_hundred' ) ) && $self->{ 'cgi' }->param( 'hundred_hundred' ) == 1 ) {
207 :     my %orgs = map { $_->[0] => 1 } grep { $_->[0] =~ /^\d+\.\d+$/ } $self->{ 'fig' }->get_attributes( undef, 'collection', 'hundred_hundred' );
208 : bartels 1.9
209 :     foreach my $g ( @genomes ) {
210 :     if ( defined( $orgs{ $g } ) ) {
211 :     $thesegenomes{ $g } = 1;
212 :     }
213 :     }
214 :     @genomes = keys %thesegenomes;
215 :     }
216 :    
217 : bartels 1.1 my %variant_codes = map { $_ => $subsystem->get_variant_code( $subsystem->get_genome_index( $_ ) ) } @genomes;
218 :     my @roles = $subsystem->get_roles;
219 :    
220 :     $datahash->{ 'genomes' } = \@genomes;
221 :     $datahash->{ 'varcodes' } = \%variant_codes;
222 :     $datahash->{ 'roles' } = \@roles;
223 :    
224 : bartels 1.6 return $datahash;
225 : bartels 1.1 }
226 :    
227 : bartels 1.2 #########################################################
228 :     # show table with variants and button for changing them #
229 :     #########################################################
230 : bartels 1.1 sub show_variants {
231 : bartels 1.12 my ( $self, $name, $sub, $can_alter, $datahash ) = @_;
232 : bartels 1.1
233 :     my $application = $self->application();
234 :    
235 :     my $cont = '';
236 :    
237 :     # get some datapoints #
238 :     my @genomes = @{ $datahash->{ 'genomes' } };
239 :     my %variant_codes = %{ $datahash->{ 'varcodes' } };
240 :     my @roles = @{ $datahash->{ 'roles' } };
241 :    
242 : bartels 1.12 my ( $abbrev, $frtable ) = $self->format_roles( $sub );
243 : bartels 1.1
244 :     my( @has, $role, %has_filled );
245 :     foreach my $genome ( @genomes ) {
246 :     @has = ();
247 :     foreach $role (@roles)
248 :     {
249 :     push(@has,($sub->get_pegs_from_cell($genome,$role) > 0) ? $abbrev->{$role} : ());
250 :     }
251 :     $has_filled{join(",",@has)}->{$variant_codes{$genome}}++;
252 :     }
253 :    
254 : bartels 1.6 my ( $col_hdrs, $pattern_uq );
255 :     if ( $can_alter ) {
256 :     $col_hdrs = [ { name => "Pattern" }, { name => "# Genomes with Pattern" },
257 :     { name => "Existing Variant Code" }, { name => "Set To" } ];
258 :     }
259 :     else {
260 :     $col_hdrs = [ { name => "Pattern" }, { name => "# Genomes with Pattern" },
261 :     { name => "Existing Variant Code" } ];
262 :     }
263 :    
264 :     my $tab = [];
265 :     foreach $pattern_uq ( sort keys( %has_filled ) ) {
266 :    
267 :     my $pattern = quotemeta( $pattern_uq );
268 : bartels 1.1
269 : bartels 1.6 my @codes = keys( %{ $has_filled{ $pattern_uq } } );
270 : bartels 1.1 my $code;
271 :     my $nrow = @codes;
272 :     if ( @codes > 0 ) {
273 :     $code = shift @codes;
274 : bartels 1.6 if ( $can_alter ) {
275 :     push( @$tab, [ $pattern_uq,
276 :     $has_filled{ $pattern_uq }->{ $code },
277 :     $code,
278 : bartels 1.12 $self->{ 'cgi' }->textfield(-name => "p##:##$pattern##:##$code", -size => 5, -value => $code, -override => 1)
279 : bartels 1.6 ]);
280 :     }
281 :     else {
282 :     push( @$tab, [ $pattern_uq,
283 :     $has_filled{ $pattern_uq }->{ $code },
284 :     $code
285 :     ]);
286 :     }
287 : bartels 1.1 }
288 : bartels 1.8
289 : bartels 1.1 foreach $code ( @codes ) {
290 : bartels 1.6 if ( $can_alter ) {
291 :     push( @$tab, [ $pattern_uq,
292 :     $has_filled{ $pattern_uq }->{ $code },
293 :     $code,
294 : bartels 1.12 $self->{ 'cgi' }->textfield( -name => "p##:##$pattern##:##$code", -size => 5, -value => $code, -override => 1)
295 : bartels 1.6 ]);
296 :     }
297 :     else {
298 :     push( @$tab, [ $pattern_uq,
299 :     $has_filled{ $pattern_uq }->{ $code },
300 :     $code
301 :     ]);
302 :     }
303 : bartels 1.1 }
304 :     }
305 : bartels 1.6
306 : bartels 1.1 $cont .= $frtable;
307 :    
308 : bartels 1.12 my $thistable = create_table( $self, \%has_filled, $col_hdrs, $tab );
309 : bartels 1.8
310 : bartels 1.5 ############################################
311 :     # Variant Descriptions from the Notes file #
312 :     ############################################
313 :     $cont .= "<H2>Variant descriptions</H2>\n";
314 :     my $variants = $sub->get_variants();
315 :    
316 :     my $infotable = '';
317 :     if ( $can_alter ) {
318 : bartels 1.8 $infotable .= "<TABLE class='table_table'><TR><TD class='table_first_row'>Variant</TD><TD class='table_first_row'>Description</TD></TR>";
319 : bartels 1.5 foreach my $kv ( sort keys %$variants ) {
320 : bartels 1.12 my $esc_kvd = $variants->{ $kv };
321 :     $esc_kvd =~ s/'/&#39;/g;
322 :     $infotable .= "<TR><TD class='table_odd_row'>";
323 :     $infotable .= $self->{ 'cgi' }->textfield( -name => "VARIANT", -id => "VARIANT", -size => 20, -value => $kv, -override => 1 );
324 :     $infotable .= "</TD><TD class='table_odd_row'>";
325 :     $infotable .= $self->{ 'cgi' }->textfield( -name => "VARIANTDESC", -id => "VARIANTDESC", -size => 70, -value => $variants->{ $kv }, -override => 1 );
326 :     $infotable .= "</TD></TR>";
327 :     }
328 :     $infotable .= "<TR><TD class='table_odd_row'>";
329 :     $infotable .= $self->{ 'cgi' }->textfield( -name => "NEWVARIANT", -id => "NEWVARIANT", -size => 20, -override => 1 );
330 :     $infotable .= "</TD><TD class='table_odd_row'>";
331 :     $infotable .= $self->{ 'cgi' }->textfield( -name => "NEWVARIANTDESC", -id => "NEWVARIANTDESC", -size => 70, -override => 1 );
332 :     $infotable .= "</TD></TR>";
333 : bartels 1.5 $infotable .= "<TR><TD>";
334 : bartels 1.12 $infotable .= $self->{ 'cgi' }->submit( -name => "addsave_variants", -value => "Add/Save Variants" );
335 : bartels 1.5 $infotable .= "</TD></TR></TABLE>";
336 :    
337 :     $cont .= $infotable;
338 :     }
339 :     else {
340 :     my $infotable = $application->component( 'VarDescTable' );
341 :     $infotable->columns( [ { name => "Variant" }, { name => "Description" } ] );
342 :    
343 :     my $vardata;
344 :     foreach my $kv ( sort keys %$variants ) {
345 :     push @$vardata, [ $kv, $variants->{ $kv } ];
346 :     }
347 :     $infotable->data( $vardata );
348 :     $cont .= $infotable->output();
349 :     }
350 :    
351 : bartels 1.7 my $esc_name = uri_escape($name);
352 : bartels 1.5
353 : bartels 1.1 $cont .= "<H2>Variant groups</H2>\n";
354 : bartels 1.8 $cont .= $thistable;
355 :    
356 : bartels 1.12 $cont .= $self->{ 'cgi' }->hidden(-name => 'request', -value => 'set_variants', -override => 1);
357 :     $cont .= $self->{ 'cgi' }->hidden(-name => 'subsystem', -value => $name, -override => 1 );
358 : bartels 1.9
359 : bartels 1.12 if ( defined( $self->{ 'cgi' }->param( 'hundred_hundred' ) ) ) {
360 :     $cont .= $self->{ 'cgi' }->hidden(-name => 'hundred_hundred', -value => $self->{ 'cgi' }->param( 'hundred_hundred' ), -override => 1 );
361 : bartels 1.9 }
362 :    
363 : bartels 1.6 if ( $can_alter ) {
364 : bartels 1.12 $cont .= $self->{ 'cgi' }->br;
365 : bartels 1.6 }
366 : bartels 1.12 $cont .= $self->{ 'cgi' }->submit( -name => "set_variants", -value => "Set Variants" );
367 : bartels 1.1 $cont .= $self->end_form();
368 :    
369 :     return $cont;
370 :     }
371 :    
372 :    
373 : bartels 1.2 ###############################
374 :     # get a functional role table #
375 :     ###############################
376 : bartels 1.1 sub format_roles {
377 : bartels 1.12 my( $self, $subsystem ) = @_;
378 : bartels 1.1 my( $i );
379 :    
380 :     my $col_hdrs = [ "Column", "Abbrev", "Functional Role" ];
381 :    
382 : bartels 1.12 my ( $tab, $abbrevP ) = $self->format_existing_roles( $subsystem );
383 : bartels 1.1
384 :     # create table from parsed data
385 : bartels 1.12 my $table = $self->application->component( 'FRTable' );
386 : bartels 1.1 $table->columns( $col_hdrs );
387 :     $table->data( $tab );
388 :    
389 :     my $formatted = '<H2>Functional Roles</H2>';
390 : bartels 1.12 $formatted .= $self->application->component( 'FRTable' )->output();
391 : bartels 1.1
392 :     $formatted .= "<BR><BR>";
393 :     return ( $abbrevP, $formatted );
394 :     }
395 :    
396 : bartels 1.2 #########################################
397 :     # get rows of the functional role table #
398 :     #########################################
399 : bartels 1.1 sub format_existing_roles {
400 : bartels 1.12 my ( $self, $subsystem ) = @_;
401 : bartels 1.1 my $tab = [];
402 :     my $abbrevP = {};
403 :    
404 :     foreach my $role ( $subsystem->get_roles ) {
405 :     my $i = $subsystem->get_role_index( $role );
406 :     my $abbrev = $role ? $subsystem->get_role_abbr( $i ) : "";
407 :     $abbrevP->{ $role } = $abbrev;
408 : bartels 1.10 push( @$tab, [ $i + 1, $abbrev, $role ] );
409 : bartels 1.1 }
410 :    
411 :     return ( $tab, $abbrevP );
412 :     }
413 :    
414 : bartels 1.2
415 :     ##############################################
416 :     # change the variants in the subsystems file #
417 :     ##############################################
418 : bartels 1.1 sub set_variants {
419 : bartels 1.12 my ( $self, $subsys, $sub, $application, $datahash ) = @_;
420 : bartels 1.1
421 :     my @genomes = @{ $datahash->{ 'genomes' } };
422 :     my %variant_codes = %{ $datahash->{ 'varcodes' } };
423 :     my @roles = @{ $datahash->{ 'roles' } };
424 :    
425 : bartels 1.12 my ( $abbrev, $frtable ) = $self->format_roles( $sub );
426 : bartels 1.1
427 :     my ( %genomes_with );
428 :     foreach my $genome ( @genomes ) {
429 :     my $vc = $variant_codes{ $genome };
430 :    
431 :     my @has = ();
432 :     foreach my $role ( @roles ) {
433 :     push( @has, ( $sub->get_pegs_from_cell( $genome, $role ) > 0 ) ? $abbrev->{ $role } : () );
434 :     }
435 : bartels 1.6 my $pattern = quotemeta( join( ",", @has ) );
436 : bartels 1.1 push( @{ $genomes_with{ "$pattern, $vc" } }, $genome );
437 :     }
438 :    
439 :     my $comment = '';
440 : bartels 1.12 my @params = grep { $_ =~ /^p##:##/ } $self->{ 'cgi' }->param;
441 : bartels 1.6
442 : bartels 1.1 foreach my $param (@params) {
443 : bartels 1.6
444 :     if ( $param =~ /^p##:##(.*)##:##(.*)$/ ) {
445 : bartels 1.1 my ( $pattern, $vc ) = ( $1, $2 );
446 : bartels 1.6
447 : bartels 1.1 $pattern =~ s/ //g;
448 :     $vc =~ s/ //g;
449 : bartels 1.12 my $to = $self->{ 'cgi' }->param( $param );
450 : bartels 1.1
451 :     if ( my $x = $genomes_with{ "$pattern, $vc" } ) {
452 : bartels 1.6 foreach my $genome ( @$x ) {
453 : bartels 1.1
454 :     if ( $to ne $variant_codes{ $genome } ) {
455 : bartels 1.6
456 : bartels 1.1 my $old = $variant_codes{$genome};
457 : bartels 1.12 my $gs = $self->{ 'fig' }->genus_species( $genome );
458 : bartels 1.1 $comment .= "resetting $genome $gs from $old to $to<BR>\n";
459 :     $sub->set_variant_code( $sub->get_genome_index( $genome ), $to );
460 :     }
461 :     }
462 :     }
463 :     }
464 :     }
465 : bartels 1.5
466 :     $sub->incr_version();
467 :     $sub->db_sync();
468 : bartels 1.1 $sub->write_subsystem();
469 :    
470 :     return $comment;
471 :     }
472 :    
473 : bartels 1.8 sub create_table {
474 : bartels 1.12 my ( $self, $has_filled, $col_hdrs, $tab ) = @_;
475 : bartels 1.8
476 :     my $in;
477 :     my $tabl = "<TABLE class='table_table'><TR>";
478 :    
479 :     foreach my $ch ( @$col_hdrs ) {
480 :     $tabl .= "<TD class='table_first_row'>";
481 :     $tabl .= $ch->{ name };
482 :     $tabl .= "</TD>";
483 :     }
484 :    
485 :     foreach my $r ( @$tab ) {
486 :     $tabl .= "<TR>";
487 :    
488 :     my $num = scalar( keys %{ $has_filled->{ $r->[0] } } );
489 :     my $pat = $r->[0];
490 :     if ( $num > 1 ) {
491 :     if ( !$in->{ $pat } ) {
492 :     $tabl .= "<TD rowspan=$num class='table_odd_row' STYLE='vertical-align: middle;'>".$r->[0]."</TD>";
493 :     $in->{ $pat } = 1;
494 :     }
495 :     }
496 :     else {
497 :     $tabl .= "<TD class='table_odd_row'>".$r->[0]."</TD>";
498 :     }
499 :     my $next = 0;
500 :     foreach my $cell ( @$r ) {
501 :     if ( $next == 0 ) {
502 :     $next = 1;
503 :     next;
504 :     }
505 :     else {
506 :     $tabl .= "<TD class='table_odd_row'>".$cell."</TD>";
507 :     }
508 :     }
509 :     $tabl .= "</TR>";
510 :     }
511 :    
512 :     $tabl .= "</TABLE>";
513 :    
514 :     return $tabl;
515 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3