#!/usr/bin/perl

use CGI qw(:standard);
use DBI;

@colors = ("#fde5e3",
           "#fde8e3",
           "#fdebe3",
           "#fdeee3",
           "#fdf4e3",
           "#fdf7e3",
           "#fdfce3",
           "#fafde3",
           "#f7fde3",
           "#fdfde3",
           "#effde3",
           "#ecfde3",
           "#e7fde3",
           "#e3fde3",
           "#e3fde6",
           "#e3fdea",
           "#e3fdf1",
           "#e3fdf5",
           "#e3fdf9",
           "#e3f1fb",
           "#e3f1ff");

%orgcolors = ("human"=>"#F4F4F4",
              "yeast"=>"#E1E1E1",
              "worm"=>"#E8E8E8",
              "fly"=>"#EEEEEE",
              "bact"=>"#D8D8D8");

@plotcolors = ("#FF0028",
               "#FFB400",
               "#E6E600",
               "#00B400",
               "#2828DC",
               "#A000E6");

@residues = ('A', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 
	     'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'Y', '*');


#------------------MAIN EXECUTABLE SECTION IF CALLED WITH PARAMETERS--------
if(param("plot1") eq "on"){
        &getParams();
        
        $usestop = "off";
        if(param("usestop") eq "on"){
                $usestop = "on";
        }

       #----------------------QUERY RETRIEVAL------------------------------
        my @table = ();
        my @sorted = ();

        #Connection block (can be simplified, but useful to preserve syntax)
        my $database = "DBI:mysql:comp:localhost:3306";
        my $db_user = "pseudo";
        my $db_password = "l33t";
        my $scermap = DBI->connect($database,$db_user,$db_password);
        #end connection block
        print STDERR "$sql_query\n"; 
        $sql_statement = $scermap->prepare("$sql_query");
        $sql_statement->execute();
        
        #Read output into two-dimensional array for HTML table
        while(my @db_rows = $sql_statement->fetchrow_array()){
                push(@table, [ @db_rows ]);
        }
        $sql_statement->finish();
        $scermap->disconnect;

        #--------------------DISTANCE MATRIX-------------------------------
	# Do this first or we lose stop signals!
        for $i (0 ... $#table){
                $legend[$i] = $table[$i][0] . " " . $table[$i][1] . " " . $table[$i][2];
                for $j (0 ... $#table){
                        $summation = 0;
                        for $k (4 ... 24){
				if(($usestop eq "on") || ($residues[$k] ne '*')){
                                	$summation += ($table[$i][$k] - $table[$j][$k])**2;
                        	}
			}
                        $distance[$i][$j] = sqrt($summation);
                }
        }

        #--------------------TABLE REARRANGEMENT FOR SORTED SETS-----------
        if(param("presort") eq "on"){
		@sortrow = ();
		@keys = ();
		# Identify which row in table is the first on the form (i.e. sortby row)
		$org = param("org1");
		$chr = param("chr1");
		$feature = param("type1");
		for $i (0 ... $#table){
			if(($table[$i][0] eq $org)
			   && ($table[$i][1] eq $chr)
			   && ($table[$i][2] eq $feature)){
				$sortby = $i;
				last;
			}
		}
		for $k (4 ... 24){
			push(@unsorted, $table[$sortby][$k]);
		}
		@sorted = sort numerically(@unsorted);
		for $k (0 ... 20){
			for $n (0 ... 20){
				# Notice I put in an extra test; this is necessary
				# when two residues have the same composition- which
				# to my great surprise is the case with one of the
				# pseudogene sets
				if(($sorted[$n] == $unsorted[$k])
				   && ($keys[$n - 1] != $k)){
					$keys[$n] = $k;
					last;
				}
			}
		}
	}

	else{
		for $k (0 ... 20){
			$keys[$k] = $k;
		}
	}

        #--------------------SPREAD----------------------------------------
        for $k (4 ... 24){
                $min = 1;
                $max = 0;
                for $i (0 ... $#table){
                        $temp[$k - 4] += $table[$i][$k];
                        if($table[$i][$k] > $max){
                                $max = $table[$i][$k];
                        }
                        if($table[$i][$k] < $min){
                                $min = $table[$i][$k];
                        }
                }
                $nextavg = $temp[$k - 4] / ($#table + 1);
                $avg[$k - 4] = sprintf("%1.3lf", $nextavg);
                $sum = 0;
                for $i (0 ... $#table){
                        $sum += ($table[$i][$k] - $avg[$k - 4])**2;
                }
                $newdev = sqrt($sum / ($#table + 1));
                $stddev[$k - 4] = sprintf("%1.3lf", $newdev);

                $nextspread = 0;
                if($avg[$k - 4] > 0){
                        $nextspread = $newdev / $avg[$k - 4];
                }
                $spread[$k - 4] = sprintf("%1.3lf", $nextspread);
                
                $nextrange = 0;
                if($avg[$k - 4] > 0){
                        $nextrange = (($max - $min) / $avg[$k - 4]);
                }
                $range[$k - 4] = sprintf("%1.3lf", $nextrange);
        }
	
	###################################################################
        #-------------------HTML OUTPUT-----------------------------------#
	###################################################################

	&cleanLegend;

        print "Content-type: text/html\n\n";
        print "
<HTML><HEAD>
<TITLE>Amino Acid Frequencies</TITLE>
</HEAD>

<BODY BGCOLOR='white' LINK=\"#007A3C\" VLINK=\"#AF0068\">
";
	#---------------STATISTICS TABLE-----------------------------------
        &headerRow;
        for $i (0 ... $#table){
                $type = $table[$i][0];
                if($type ne "human" && $type ne "worm" && $type ne "fly" && $type ne "yeast"){
                        $type = "bact";
                }
                print "
	<TR>
		<TD BGCOLOR=\"$orgcolors{$type}\">
		<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1 COLOR=\"$plotcolors[$i]\">
			<B>$legend[$i]</B>
		</FONT>
		</TD>
		<TD BGCOLOR=\"$orgcolors{$type}\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1>$table[$i][3]</FONT>
		</TD>";
                
                my @stats = ();
                my %tdcolors = ();
                for $j (4 ... 24){
                        push(@stats, $table[$i][$j]);
                }
                $k = 0;
                foreach $freq (@listed = sort numerically @stats){
                        $freq = sprintf("%1.3lf", $freq);
                        $tdcolors{$freq} = $colors[$k++];
                }
                
                for $k (0 ... 20){
                        $freq = sprintf("%1.3lf", $stats[$keys[$k]]);
                        print "
		<TD BGCOLOR=\"$tdcolors{$freq}\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1>$freq</FONT>
		</TD>\n";
                }
                print "</TR>";
        }
        
        #------------------Printout of average and spread rows-------------------

	#Mean
        $k = 0;
        foreach $average (@listed = sort numerically @avg){
                $tdcolors{$average} = $colors[$k++];
        }

        print "
	<TR></TR>
	<TR>
		<TD BGCOLOR=\"#E8E8E8\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1><B>Mean</B></FONT>
		</TD>
		<TD BGCOLOR=\"#E8E8E8\">&nbsp</TD>";

        for $k (0 ... 20){
                print "
		<TD BGCOLOR=\"$tdcolors{$avg[$keys[$k]]}\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1>$avg[$keys[$k]]</FONT>
		</TD>\n";
        }

	#Standard deviation
	$k = 0;
        foreach $devval (@listed = sort numerically @stddev){
                $tdcolors{$devval} = $colors[$k++];
        }
        print "
	</TR>
		<TD BGCOLOR=\"#E8E8E8\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1><B>Std. Dev.</B></FONT>
		</TD>
                <TD BGCOLOR=\"#E8E8E8\">&nbsp</TD>\n\n";

        for $k (0 ... 20){
                print "
		<TD BGCOLOR=\"$tdcolors{$stddev[$keys[$k]]}\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1>$stddev[$keys[$k]]</FONT>
		</TD>\n";
        }
        print "</TR>\n";

	# Scaled deviation (spread)
        $k = 0;
        foreach $spreadval (@listed = sort numerically @spread){
                $tdcolors{$spreadval} = $colors[$k++];
        }
        print "
	</TR>
		<TD BGCOLOR=\"#E8E8E8\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1><B>stddev / mean</B></FONT>
		</TD>
	       	<TD BGCOLOR=\"#E8E8E8\">&nbsp</TD>\n";

        for $k (0 ... 20){
                print "
		<TD BGCOLOR=\"$tdcolors{$spread[$keys[$k]]}\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1>$spread[$keys[$k]]</FONT>
		</TD>\n";
        }
        print "</TR>\n";

	# Scaled range
        $k = 0;
        foreach $rangeval (@listed = sort numerically @range){
                $tdcolors{$rangeval} = $colors[$k++];
        }

        print "
	</TR>
		<TD BGCOLOR=\"#E8E8E8\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1><B>range / mean</B></FONT>
		</TD>
        	<TD BGCOLOR=\"#E8E8E8\">&nbsp</TD>\n";

        for $k (0 ... 20){
                print "
		<TD BGCOLOR=\"$tdcolors{$range[$keys[$k]]}\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1>$range[$keys[$k]]</FONT>
		</TD>\n";
        }
        print "</TR>\n";
	
	#--------------END OF RESIDUE DATA TABLE-------------------------

        # Distance matrix display
        print "
</TABLE>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=4>
	<TR><TD><H3>Distance Matrix</H3></TD></TR>
	<TR><TD>
	<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
		<TR><TD BGCOLOR=\"#FFFFFF\">&nbsp</TD>\n";

        for $i (0 ... $#table){
                print "
		<TD BGCOLOR=\"#E4E4E4\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1 COLOR=\"$plotcolors[$i]\">
			$legend[$i]</FONT>
		</TD>\n";

        }
        print "</TR>\n";

	#Distance matrix
        for $i (0 ... $#table){
                print "
		<TD BGCOLOR=\"#E4E4E4\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1 COLOR=\"$plotcolors[$i]\">
		$legend[$i]</FONT>
		</TD>\n";
                for $j (0 ... $#table){
                        if($distance[$i][$j] == 0){
                                $d = sprintf "0";
                        }
                        else{
                                $d = sprintf "%1.4lf", $distance[$i][$j];
                        }
                        print "
		<TD BGCOLOR=\"#E8E8E8\">
			<FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=1>$d</FONT></TD>\n";
                }
                print "</TR>\n";
        }

	#Call other scripts to draw images
	print "</TABLE>\n</TD></TR></TABLE>";
        if(param("presort") eq "on"){
		print "<BLOCKQUOTE>
	<IMG SRC=\"./chart_human.cgi?$query_string&sort=on\" BORDER=0></IMG>";
        }
        else{
		print "<BLOCKQUOTE>
	<IMG SRC=\"./chart_human.cgi?$query_string\" BORDER=0></IMG>";
        }

        print "
</BLOCKQUOTE>
</BODY></HTML>
";

}                
        

#------------------NO PARAMETERS (default)----------------------------------
elsif( !(param()) || !(param("plot1"))){
        &defaultPage;
}

#------------------SUBROUTINES----------------------------------------------
sub numerically { $b <=> $a; }       

sub cleanLegend {

	for $i (0 ... $#legend){
		$legend[$i] =~ s/\ gene/\ genes/;
		$legend[$i] =~ s/\ pseudo/\ pseudogenes/;
		$legend[$i] =~ s/\ homol/\ homologies/;
		$legend[$i] =~ s/\ chr/\ chromosome/;
		$legend[$i] =~ s/burge/GenomeScan/;	
		$legend[$i] =~ s/proc/processed/;
		$legend[$i] =~ s/old/ancient/;
		$legend[$i] =~ s/new/modern/;
		$legend[$i] =~ s/swp/SWISS-PROT/;

		if($legend[$i] =~ /^all\ /){
			$legend[$i] =~ s/^all\ //;
			$legend[$i] =~ s/chromosome/chromosomes/;
			$chrnum = "All chrs.";
		}
		else{
			$chrnum = $legend[$i];
			$chrnum =~ s/\ .*//;
			$chrnum = "Chr. " . $chrnum;
			$legend =~ s/\w*\ //;
		}
		
		$class = $legend[$i];
		$class =~ s/.*\ //;
		$class .= " ";
		if($class =~ /all/ && $legend[$i] =~ /chromosome/){
			$class = "";
		}
		$legend[$i] =~ s/\ .*//;
		$legend[$i] = $chrnum . ", " . $class . $legend[$i];
	}
}

# Query parsing section
sub getParams {
	$sql_query = "SELECT * FROM human WHERE ";
	if(param("plot1") eq "on"){
		$chr1 = param("chr1");
		$type1 = param("type1");
		$class1 = param("class1");
		$query_string .= "&plot1=" . $chr1 . "." . $type1 . "." . $class1;
		$sql_query .= " ( chromosome = '$chr1' AND class = '$class1' AND feature = '$type1')";
	}
	if(param("plot2") eq "on"){
		$chr2 = param("chr2");
		$type2 = param("type2");
		$class2 = param("class2");
		$query_string .= "&plot2=" . $chr2 . "." . $type2 . "." . $class2;
		$sql_query .= " OR ( chromosome = '$chr2' AND class = '$class2' AND feature = '$type2')";
	}
	if(param("plot3") eq "on"){
		$chr3 = param("chr3");
		$type3 = param("type3");
		$class3 = param("class3");
		$query_string .= "&plot3=" . $chr3 . "." . $type3 . "." . $class3;
		$sql_query .= " OR ( chromosome = '$chr3' AND class = '$class3' AND feature = '$type3')";
	}
	if(param("plot4") eq "on"){
		$chr4 = param("chr4");
		$type4 = param("type4");
		$class4 = param("class4");
		$query_string .= "&plot4=" . $chr4 . "." . $type4 . "." . $class4;
		$sql_query .= " OR ( chromosome = '$chr4' AND class = '$class4' AND feature = '$type4')";
	}
	if(param("plot5") eq "on"){
		$type5 = param("type5");
		$chr5 = param("chr5");
		$class5 = param("class5");
		$query_string .= "&plot5=" . $chr5 . "." . $type5 . "." . $class5;
		$sql_query .= " OR ( chromosome = '$chr5' AND class = '$class5' AND feature = '$type5')";
	}
	if(param("plot6") eq "on"){
		$chr6 = param("chr6");
		$type6 = param("type6");
		$class6 = param("class6");
		$query_string .= "&plot6=" . $chr6 . "." . $type6 . "." . $class6;
		$sql_query .= " OR ( chromosome = '$chr6' AND class = '$class6' AND feature = '$type6')";
	}
	if(!($size = param("size"))){
		$size = 20;
	}
	$query_string .= "&size=$size";
}

sub headerRow {
	if(param("presort") eq "on"){
		print "<H3>Plotted data (sorted by $chr1 $class1, chr. $chr1)</H3>";
	}
	else{
		print "<H3>Plotted data (unsorted)</H3>";
	}
print "
<TABLE CELLSPACING=1 CELLPADDING=1 BORDER=0>
<TR>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>Feature</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>Residues</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[0]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[1]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[2]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[3]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[4]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[5]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[6]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[7]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[8]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[9]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[10]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[11]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[12]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[13]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[14]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[15]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[16]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[17]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[18]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[19]]</B></FONT></TD>
<TD><FONT FACE=\"arial, Helvetica, sans-serif\" SIZE=2><B>$residues[$keys[20]]</B></FONT></TD>
</TR>
";
}

# Index page, displayed when executed without parameters
sub defaultPage {
        print header(), start_html("Comparative Residue Frequency");
        print body({-bgcolor=>'white', -link=>'#004600', -vlink=>'#7A0000'},
                   h2("Human genome composition statistics"),
                   h4("<A HREF='/composition'>[ Back to overview page ]</A>"),
				   start_form({-method=>'POST'}),
                   table({-bgcolor=>'#E2E2E2', -cellspacing=>'2', -cellpadding=>'2', -cols=>'2', 
			  -width=>'840', -border=>'0'},
                         Tr(td(
                               font({-face=>'arial, Helvetica, sans-serif', -size=>'1'},
                                    input({-type=>'checkbox', -name=>'plot1', -value=>'on'}, b("1.")),
                                    b("Chromosome: "),
                                    popup_menu(-name=>'chr1',
                                               -values=>['all','1','2','3','4','5','6', '7','8', 
                                                         '9','10','11','12','13','14','15','16', 
                                                         '17','18','19','20','21','22','X','Y']),
                                    b("Feature: "),
                                    popup_menu(-name=>'type1',
                                               -values=>['chr', 'gene', 'homol', 'pseudo'],
                                               -default=>'gene'),
				    b("Class: "),
				    popup_menu(-name=>'class1',
					       -values=>['all', 'burge', 'ensembl', 'ebi', 'swp',
							 'new', 'old', 'proc', 'unproc',
							 'start', 'middle', 'end'],
					       -labels=>{'all'=>'ALL',
							 'burge'=>'GenomeScan',
							 'ensembl'=>'Ensembl',
							 'ebi'=>'EBI',
							 'swp'=>'SWISS-PROT',
							 'new'=>'recent',
							 'old'=>'ancient',
							 'proc'=>'processed',
							 'unproc'=>'unprocessed',
							 'start'=>'1st quarter',
							 'middle'=>'Middle half',
							 'end'=>'Last quarter'}),
				   )),
			    td(
                               font({-face=>'arial, Helvetica, sans-serif', -size=>'1'},
                                    input({-type=>'checkbox', -name=>'plot4', -value=>'on'}, b("4.")),
                                    b("Chromosome: "),
                                    popup_menu(-name=>'chr4',
                                               -values=>['all','1','2','3','4','5','6', '7','8', 
                                                         '9','10','11','12','13','14','15','16', 
                                                         '17','18','19','20','21','22','X','Y']),
                                    b("Feature: "),
                                    popup_menu(-name=>'type4',
                                               -values=>['chr', 'gene', 'homol', 'pseudo'],
                                               -default=>'gene'),
				    b("Class: "),
				    popup_menu(-name=>'class4',
					       -values=>['all', 'burge', 'ensembl', 'ebi', 'swp',
							 'new', 'old', 'proc', 'unproc',
							 'start', 'middle', 'end'],
					       -labels=>{'all'=>'ALL',
							 'burge'=>'GenomeScan',
							 'ensembl'=>'Ensembl',
							 'ebi'=>'EBI',
							 'swp'=>'SWISS-PROT',
							 'new'=>'recent',
							 'old'=>'ancient',
							 'proc'=>'processed',
							 'unproc'=>'unprocessed',
							 'start'=>'1st quarter',
							 'middle'=>'Middle half',
							 'end'=>'Last quarter'}),
                                    ))),
                         Tr(td(
                               font({-face=>'arial, Helvetica, sans-serif', -size=>'1'},
                                    input({-type=>'checkbox', -name=>'plot2', -value=>'on'}, b("2.")),
                                    b("Chromosome: "),
                                    popup_menu(-name=>'chr2',
                                               -values=>['all','1','2','3','4','5','6', '7','8', 
                                                         '9','10','11','12','13','14','15','16', 
                                                         '17','18','19','20','21','22','X','Y']),
                                    b("Feature: "),
                                    popup_menu(-name=>'type2',
                                               -values=>['chr', 'gene', 'homol', 'pseudo'],
                                               -default=>'gene'),
				    b("Class: "),
				    popup_menu(-name=>'class2',
					       -values=>['all', 'burge', 'ensembl', 'ebi', 'swp',
							 'new', 'old', 'proc', 'unproc',
							 'start', 'middle', 'end'],
					       -labels=>{'all'=>'ALL',
							 'burge'=>'GenomeScan',
							 'ensembl'=>'Ensembl',
							 'ebi'=>'EBI',
							 'swp'=>'SWISS-PROT',
							 'new'=>'recent',
							 'old'=>'ancient',
							 'proc'=>'processed',
							 'unproc'=>'unprocessed',
							 'start'=>'1st quarter',
							 'middle'=>'Middle half',
							 'end'=>'Last quarter'}),
                                    )),
                            td(
                               font({-face=>'arial, Helvetica, sans-serif', -size=>'1'},
                                    input({-type=>'checkbox', -name=>'plot5', -value=>'on'}, b("5.")),
                                    b("Chromosome: "),
                                    popup_menu(-name=>'chr5',
                                               -values=>['all','1','2','3','4','5','6', '7','8', 
                                                         '9','10','11','12','13','14','15','16', 
                                                         '17','18','19','20','21','22','X','Y']),
                                    b("Feature: "),
                                    popup_menu(-name=>'type5',
                                               -values=>['chr', 'gene', 'homol', 'pseudo'],
                                               -default=>'gene'),
				    b("Class: "),
				    popup_menu(-name=>'class5',
					       -values=>['all', 'burge', 'ensembl', 'ebi', 'swp',
							 'new', 'old', 'proc', 'unproc',
							 'start', 'middle', 'end'],
					       -labels=>{'all'=>'ALL',
							 'burge'=>'GenomeScan',
							 'ensembl'=>'Ensembl',
							 'ebi'=>'EBI',
							 'swp'=>'SWISS-PROT',
							 'new'=>'recent',
							 'old'=>'ancient',
							 'proc'=>'processed',
							 'unproc'=>'unprocessed',
							 'start'=>'1st quarter',
							 'middle'=>'Middle half',
							 'end'=>'Last quarter'}),
                                    ))),
                         Tr(td(
                               font({-face=>'arial, Helvetica, sans-serif', -size=>'1'},
                                    input({-type=>'checkbox', -name=>'plot3', -value=>'on'}, b("3.")),
                                    b("Chromosome: "),
                                    popup_menu(-name=>'chr3',
                                               -values=>['all','1','2','3','4','5','6', '7','8', 
                                                         '9','10','11','12','13','14','15','16', 
                                                         '17','18','19','20','21','22','X','Y']),
                                    b("Feature: "),
                                    popup_menu(-name=>'type3',
                                               -values=>['chr', 'gene', 'homol', 'pseudo'],
                                               -default=>'gene'),
				    b("Class: "),
				    popup_menu(-name=>'class3',
					       -values=>['all', 'burge', 'ensembl', 'ebi', 'swp',
							 'new', 'old', 'proc', 'unproc',
							 'start', 'middle', 'end'],
					       -labels=>{'all'=>'ALL',
							 'burge'=>'GenomeScan',
							 'ensembl'=>'Ensembl',
							 'ebi'=>'EBI',
							 'swp'=>'SWISS-PROT',
							 'new'=>'recent',
							 'old'=>'ancient',
							 'proc'=>'processed',
							 'unproc'=>'unprocessed',
							 'start'=>'1st quarter',
							 'middle'=>'Middle half',
							 'end'=>'Last quarter'}),
                                    )),
                            td(
                               font({-face=>'arial, Helvetica, sans-serif', -size=>'1'},
                                    input({-type=>'checkbox', -name=>'plot6', -value=>'on'}, b("6.")),
                                    b("Chromosome: "),
                                    popup_menu(-name=>'chr6',
                                               -values=>['all','1','2','3','4','5','6', '7','8', 
                                                         '9','10','11','12','13','14','15','16', 
                                                         '17','18','19','20','21','22','X','Y']),
                                    b("Feature: "),
                                    popup_menu(-name=>'type6',
                                               -values=>['chr', 'gene', 'homol', 'pseudo'],
                                               -default=>'gene'),
				    b("Class: "),
				    popup_menu(-name=>'class6',
					       -values=>['all', 'burge', 'ensembl', 'ebi', 'swp',
							 'new', 'old', 'proc', 'unproc',
							 'start', 'middle', 'end'],
					       -labels=>{'all'=>'ALL',
							 'burge'=>'GenomeScan',
							 'ensembl'=>'Ensembl',
							 'ebi'=>'EBI',
							 'swp'=>'SWISS-PROT',
							 'new'=>'recent',
							 'old'=>'ancient',
							 'proc'=>'processed',
							 'unproc'=>'unprocessed',
							 'start'=>'1st quarter',
							 'middle'=>'Middle half',
							 'end'=>'Last quarter'}),
				   ))),
                         Tr(td({-colspan=>'2'},
                               font({-face=>'arial, Helvetica, sans-serif', -size=>'2'},
                                    "Plot Size: ",
                                    popup_menu(-name=>'size',
                                               -values=>['20', '25', '30', '40'],
                                               -labels=>{'20'=>'small (460x300)',
                                                         '25'=>'medium (565x360)',
                                                         '30'=>'large (670x420)',
                                                         '40'=>'HUGE (880x540)'},
                                               -default=>'460x300'),
                                    input({-type=>'checkbox', -value=>'on', -name=>'presort'},
                                          b("Sort frequencies by first set")),
                                    input({-type=>'checkbox', -value=>'on', -name=>'usestop'},
                                          b("Use stop codons in dist. matrix")),
                                    submit("Plot Values"), reset(),
                                    br(),
                                    blockquote(
                                               b("Example with default selection:"), br(),
                                               img({-src=>'./chart_human.cgi', -border=>'0'})))))),
		   hr(),
		   table({-width=>'640'},
			 Tr(td(
                               font({-face=>'arial, Helvetica, sans-serif', -size=>'2'},
                                    "Not all chromosomes and features can be used with all organisms.",
                                    "Until I get a better knowledge of JavaScript, this page will detect",
                                    "type mismatches manually.")))));
        print end_html();
}
