<?php
	include("php.inc");
	ini_set("memory_limit","20M");
	global $PHP_SELF, $action, $what, $user_group, $print_run, $tag_choice,$page;
        define("INITIAL_PAGE","0");
        define("FORMAT","1");
	define("TAG","2");
	define("SEARCH","3");

	$PHP_SELF = $_SERVER['PHP_SELF'];
	$action = $_REQUEST['action'];
	$tag_choice = $_REQUEST['tag_choice'];

	function download_format()
	{
		$list = $_REQUEST["download_list"];

		$group_ids = implode(",",$list);
		$query = "select ggroup.id, group_name, description, gene.id, gene_name from ggroup, group_gene, gene where visibility = 'public' and ggroup.id in ($group_ids) and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id order by ggroup.downloads desc, ggroup.date desc, group_name, gene_name";
		print "$query\n<br>";
		$result = mysql_query($query) or die("Query failed: ".mysql_error());
		
		while($row = mysql_fetch_row($result))
		{
			$group_id_list[] = $row[0];
			$group_names[] = $row[1];
			$description[] = $row[2];
			$gene_ids[] = $row[3];
			$gene_names[] = $row[4];
			$group_gene_names[$row[0]][] = $row[4];
			$group_desc[$row[0]] = $row[2];
			$group_names[$row[0]]=$row[1];
		}
		#print "$query\n";

		print "<h3>Choose a file format</h3>";
		print "<form action=\"download.php\" method=\"POST\"><table class=\"entry\">";
		print "<input type=\"hidden\" name=\"group_names\" value=\"";
		print base64_encode(serialize($group_names));
		print "\">";
		print "<input type=\"hidden\" name=\"group_gene_names\" value=\"";
		print base64_encode(serialize($group_gene_names));
		print "\">";
		print "<input type=\"hidden\" name=\"group_desc\" value=\"";
		print base64_encode(serialize($group_desc));
		print "\">";
		
		#print '<input type="hidden" name="gene_names" value="',serialize($gene_names),'">'; 
		
		print "<tr><td colspan=2 class=\"format_head\">gene tab group (iGA)</td></tr><tr>";
		print "<td class=\"format\"><input type=\"radio\" name=\"format\" value=0></td><td class=\"format\"><pre>";
		foreach(array(0,1,2) as $i)
		{
			print "gene_name\tgroup_name\n";
		}
		print "</pre></td></tr>";

		print "<tr><td colspan=2 class=\"format_head\">group tab gene tab gene (CatMap)</td></tr><tr>";
		print "<td class=\"format\"><input type=\"radio\" name=\"format\" value=1></td><td class=\"format\"><pre>";
		foreach(array(0,1) as $i)
		{
			print "group_name\t";
			foreach(array(0,1,2,3) as $j)
			{
				print "gene_name\t";
			}
			print "\n";
		}
	
		print "<tr><td colspan=2 class=\"format_head\">group tab description tab gene (.gmt for GSEA)</td></tr><tr>";
		print "<td class=\"format\"><input type=\"radio\" name=\"format\" value=2></td><td class=\"format\"><pre>";
		foreach(array(0,1) as $i)
		{
			print "group_name\tdescription\t";
			foreach(array(0,1,2) as $j)
			{
				print "gene_name\t";
			}
			print "\n";
		}

		
		$file="text";
		print "</table><input type=\"Submit\" name=\"Download\" value=\"Download\"></form>";
	}
	function find_form()
	{
                print "<form action=\"retrieve.php?action=2\" method=\"GET\">";
		print "Search by any of the following.<p>";
                print "<table class=\"entry\">";
		
		#group name
                print "<tr>";
                print "<td class=\"entry\">Group Name:</td><td class=\"entry\">";
                print "<input type=\"text\" name=\"search_group_name\">";
	
		#visibility
		print "<tr><td class=\"entry\"></td><td class=\"entry\"><input type=\"radio\" name=\"search_visibility\" value=\"public\" checked>Public&nbsp;&nbsp;&nbsp;<input type=\"radio\" name=\"search_visibility\" value=\"private\">Private</td><td class=\"annotation\">Public - search all public groups, Private - search only your private groups.</tr>";
                
		print "<tr>";
                print "<td class=\"entry\" valign=\"top\">Groups containing genes:</td><td class=\"entry\">";
                print "<textarea name=\"search_gene_list\" rows=\"3\" cols=\"40\"></textarea>\n";
                print "<td class=\"annotation\">Separate each gene name with white space, a new line, or a comma.</td></tr>";

		#AND/OR for genes
		print "<tr><td class=\"entry\" valign=\"top\"></td><td class=\"entry\">";
		print "<input type=\"radio\" name=\"search_gene_list_how\" value=\"AND\" checked>AND<input type=\"radio\" name=\"search_gene_list_how\" value=\"OR\">OR";
                print "<td class=\"annotation\">AND - select groups that contain ALL of the genes listed, OR - select groups that contain any of the genes listed.</td></tr>";

                #Description - drop box or text
                print "<tr><td class=\"entry\">&nbsp;</td></tr><tr>";
                print "<td class=\"entry\" valign=\"top\">Description:</td><td class=\"entry\">";
                print "<input type=\"text\" name=\"search_description\" maxlength=\"255\" value=\"\"></td></tr>\n";

                #Date - maybe like "in the last week, in the last year, etc.";
                #print "<tr>";
                #print "<td class=\"entry\" valign=\"top\">Date:</td><td class=\"entry\"><input type=\"text\" name=\"date\" size=\"9\" maxlength=\"10\" value=\"$today\"></td></tr>\n";
                #tags
                print "<tr>";
                print "<td class=\"entry\">Tags:</td><td class=\"entry\"><input type=\"text\" name=\"search_tags\" size=\"40\"></td>\n";
                print "<td class=\"annotation\">Tags are like categories. </td></tr>";
		#AND/OR for tags 
		print "<tr><td class=\"entry\" valign=\"top\"></td><td class=\"entry\">";
		print "<input type=\"radio\" name=\"search_tag_list_how\" value=\"AND\" checked>AND<input type=\"radio\" name=\"search_tag_list_how\" value=\"OR\">OR";
                print "<td class=\"annotation\">AND - select groups labeled with ALL of the tags listed, OR - select groups labeled with any of the tags listed.</td></tr>";
                print "<tr><td class=\"entry\">&nbsp;</td></tr><tr>";

                print "<td class=\"entry\">Email:</td><td class=\"entry\"><input type=\"text\" name=\"search_email\"></td></tr>\n";


                print "</table><p>";
                print "<input class=\"button\" type=\"submit\" value=\"Search\">";
                print "</form>";
        }
	function create_search_query ($search_group_name,$search_gene_list,$search_gene_list_how,$search_description,$search_tags,$search_tag_list_how,$search_email)
	{
		#split some stuff, like tags and genes
		#tags
		$tags = ParseTagString($search_tags); #split the tags and return an array
		$number_of_tags = count($tags);
		$tag_list = implode("\",\"",$tags);
	
		#genes
		if(preg_match("/,/",$search_gene_list))
                {
                        $genes = preg_split("/\s*,\s*/",$search_gene_list);
                }
                else
                {
                        $search_gene_list = preg_replace("/^\s+/","",$search_gene_list);
                        $search_gene_list = preg_replace("/\s+$/","",$search_gene_list);
                        $genes = preg_split("/\s+/",$search_gene_list);
                }
		$number_of_genes = count($genes);
		$gene_list = implode("\",\"",$genes);

		if($search_group_name)
		{
			#print "group_name<br>";
			if($search_gene_list)
			{
				#print "gene list<br>";
				if($search_description)
				{
					if($search_tags)
					{
						if($search_email)
						{
							#group name, gene list, description, tags, email
							if($search_gene_list_how == "AND")
							{
								if($search_tag_list_how == "AND") #AND AND
								{
									#that's how we did it.
									$temp = max($number_of_tags,$number_of_genes);
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and description like \%$search_description%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$temp";
								}
								else #AND OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and description like \%$search_description%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$number_of_genes";
								}
							}
							else
							{
								if($search_tag_list_how == "AND") #OR AND
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and description like \%$search_description%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
								}
								else #OR OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and description like \%$search_description%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id";
								}
							}
						}
						else
						{
							#group name, gene list, description, tags
							if($search_gene_list_how == "AND")
							{
								if($search_tag_list_how == "AND") #AND AND
								{
									$temp = max($number_of_tags,$number_of_genes);
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and description like \%$search_description%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$temp";
								}
								else #AND OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and description like \%$search_description%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$number_of_genes";
								}
							}
							else
							{
								if($search_tag_list_how == "AND") #OR AND
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and description like \%$search_description%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
								}
								else #OR OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and description like \%$search_description%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id";
								}
							}
						}
					}
					else #no tags
					{
						if($search_email)
						{
							#group name, gene list, description, email
							if($search_gene_list_how == "AND")
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and creator like \"$search_email\" and description like \"%$search_description%\" and group_name like \"%$search_group_name%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
							}
							else
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and creator like \"$search_email\" and description like \"%$search_description%\" and group_name like \"%$search_group_name%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id";
							}
						}
						else
						{
							#group name, gene list, description
							if($search_gene_list_how == "AND")
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and description like \"%$search_description%\" and group_name like \"%$search_group_name%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
							}
							else
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and description like \"%$search_description%\" and group_name like \"%$search_group_name%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id";
							}
						}
					}
				}
				else #no description
				{
					#print "no description<br>";
					if($search_tags)
					{
						if($search_email)
						{
							if($search_gene_list_how == "AND")
							{
								if($search_tag_list_how == "AND") #AND AND
								{
									#group name, gene list, tags, email
									$temp = max($number_of_tags,$number_of_genes);
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$temp";
								}
								else #AND OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$number_of_genes";
								}
							}
							else
							{
								if($search_tag_list_how == "AND") #OR AND
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
								}
								else #OR OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and creator like \"$search_email\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id";
								}
							}
						}
						else
						{
							#group name, gene list, tags
							if($search_gene_list_how == "AND")
							{
								if($search_tag_list_how == "AND") #AND AND
								{
									$temp = max($number_of_tags,$number_of_genes);
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$temp";
								}
								else #AND OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$number_of_genes";
								}
							}
							else
							{
								if($search_tag_list_how == "AND") #OR AND
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
								}
								else #OR OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_group_name%\" group by ggroup.id";
								}
							}
						}
					}
					else #no tags
					{
						if($search_email)
						{
							if($search_gene_list_how == "AND")
							{
								#group name, gene list, email
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and group_name like \"%$search_group_name%\" and creator like \"$search_email\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
							}
							else
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and group_name like \"%$search_group_name%\" and creator like \"$search_email\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id";
							}
						}
						else
						{
							if($search_gene_list_how == "AND")
							{
								#group name, gene list
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and group_name like \"%$search_group_name%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
							}
							else
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and group_name like \"%$search_group_name%\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id";
							}
						}
					}
				}
			}
			else #no gene list
			{
				if($search_description)
				{
					if($search_tags)
					{
						if($search_email)
						{
							#group name, description, tags, email
							if($search_tag_list_how == "AND") #OR AND
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and creator like \"$search_email\" and group_name like \"%$search_group_name%\" and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
							}
							else #OR OR
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and creator like \"$search_email\" and group_name like \"%$search_group_name%\" and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id";
							}
						}	
						else
						{
							#group name, description, tags
							if($search_tag_list_how == "AND") #OR AND
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and group_name like \"%$search_group_name%\" and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
							}
							else #OR OR
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and group_name like \"%$search_group_name%\" and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id";
							}
						}
					}
					else #no tags
					{
						if($search_email)
						{
							#group name, description, email
							$query = "select ggroup.id, group_name,description,date,creator from ggroup where visibility = 'public' and group_name like \"%$search_group_name%\" and description like \"%$search_description%\" and creator like \"$search_email\"";
						}
						else
						{
							#group name, description
							$query = "select ggroup.id, group_name,description,date,creator from ggroup where visibility = 'public' and group_name like \"%$search_group_name%\" and description like \"%$search_description%\"";
						}
					}
				}
				else # no description
				{
					if($search_tags)
					{
						if($search_email)
						{
							if($search_tag_list_how == "AND") #OR AND
							{
								#group name, tags, email
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and creator like \"$search_email\" and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_name%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
							}
							else #OR OR
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and creator like \"$search_email\" and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_name%\" group by ggroup.id";
							}
						}
						else
						{
							if($search_tag_list_how == "AND") #OR AND
							{
								#group name, tags
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_name%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
							}
							else #OR OR
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and group_name like \"%$search_name%\" group by ggroup.id";
							}
						}
					}
					else # no tags
					{
						if($search_email)
						{
							#group name, email
							$query = "select ggroup.id,group_name,description,date,creator from ggroup where visibility = 'public' and creator like \"$search_email\" and group_name like \"%$search_group_name%\"";
						}
						else
						{
							#group name
							$query = "select ggroup.id,group_name,description,date,creator from ggroup where visibility = 'public' and group_name like \"%$search_group_name%\"";
						}
					}
				}
			}
		}
		else #no group name
		{
			if($search_gene_list)
			{
				if($search_description)
				{
					if($search_tags)
					{
						if($search_email)
						{
							if($search_gene_list_how == "AND")
							{
								if($search_tag_list_how == "AND") #AND AND
								{
									#gene list, description, tags, email
									$temp = max($number_of_tags,$number_of_genes);
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" and creator like \"$search_email\" group by ggroup.id having count(ggroup.id)=$temp";
								}
								else #AND OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" and creator like \"$search_email\" group by ggroup.id having count(ggroup.id)=$number_of_genes";
								}
							}
							else
							{
								if($search_tag_list_how == "AND") #OR AND
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" and creator like \"$search_email\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
								}
								else #OR OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" and creator like \"$search_email\" group by ggroup.id";
								}
							}
						}
						else #no email
						{
							if($search_gene_list_how == "AND")
							{
								if($search_tag_list_how == "AND") #AND AND
								{
									#gene list, description, tags
									$temp = max($number_of_tags,$number_of_genes);
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id having count(ggroup.id)=$temp";
								}
								else #AND OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id having count(ggroup.id)=$number_of_genes";
								}
							}
							else
							{
								if($search_tag_list_how == "AND") #OR AND
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
								}
								else #OR OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id";
								}
							}
						}
					}
					else #no tags
					{
						if($search_email)
						{
							if($search_gene_list_how == "AND")
							{
								#gene list, description, email
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and description like \"%$search_description%\" and creator = \"$search_email\" and gene_name in (\"$gene_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
							}
							else
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and description like \"%$search_description%\" and creator = \"$search_email\" and gene_name in (\"$gene_list\") group by ggroup.id";
							}
								
						}
						else
						{
							if($search_gene_list_how == "AND")
							{
								#gene list, description
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and description like \"%$search_description%\" and gene_name in (\"$gene_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
							}
							else
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and description like \"%$search_description%\" and gene_name in (\"$gene_list\") group by ggroup.id";
							}
						}
					}
				}	
				else #no description
				{
					if($search_tags)
					{
						if($search_email)
						{
							if($search_gene_list_how == "AND")
							{
								if($search_tag_list_how == "AND") #AND AND
								{
									#gene list, tags, email
									$temp = max($number_of_tags,$number_of_genes);
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and creator = \"$search_email\" group by ggroup.id having count(ggroup.id)=$temp";
								}
								else #AND OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and creator = \"$search_email\" group by ggroup.id having count(ggroup.id)=$number_of_genes";
								}
							}
							else
							{
								if($search_tag_list_how == "AND") #OR AND
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and creator = \"$search_email\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
								}
								else #OR OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and creator = \"$search_email\" group by ggroup.id";
								}
							}
						}
						else
						{
							if($search_gene_list_how == "AND")
							{
								if($search_tag_list_how == "AND") #AND AND
								{
									#gene list, tags
									$temp = max($number_of_tags,$number_of_genes);
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") group by ggroup.id having count(ggroup.id)=$temp";
								}
								else #AND OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
								}
							}
							else
							{
								if($search_tag_list_how == "AND") #OR AND
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") group by ggroup.id having count(ggroup.id)=$number_of_tags";
								}
								else #OR OR
								{
									$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene,group_tag,tag where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") group by ggroup.id";
								}
							}
						}
					}
					else
					{
						if($search_email)
						{
							if($search_gene_list_how == "AND")
							{
								#gene list, email
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and creator = \"$search_email\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
							}
							else
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where  visibility = 'public' and creator = \"$search_email\" and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id";
							}
						}
						else#no email
						{
							if($search_gene_list_how == "AND")
							{
								#gene list
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id having count(ggroup.id)=$number_of_genes";
							}
							else
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene where visibility = 'public' and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and gene_name in (\"$gene_list\") group by ggroup.id";
							}
						}
					}
				}
			}
			else # no gene list
			{
				if($search_description)
				{
					if($search_tags)
					{
						if($search_email)
						{
							if($search_tag_list_how == "AND") #OR AND
							{
								#description, tags, email
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\"  and creator = \"$search_email\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
							}
							else #OR OR
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\"  and creator = \"$search_email\" group by ggroup.id";
							}
						}
						else
						{
							if($search_tag_list_how == "AND") #OR AND
							{
								#description, tags
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
							}
							else #OR OR
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and description like \"%$search_description%\" group by ggroup.id";
							}
						}
					}
					else #no tags
					{
						if($search_email)
						{
							#description, email
							$query = "select ggroup.id, group_name,description,date,creator from ggroup where visibility = 'public' and description like \"%$search_description%\" and creator like $search_email";
						}
						else
						{
							#description
							$query = "select ggroup.id, group_name,description,date,creator from ggroup where visibility = 'public' and description like \"%$search_description%\"";
						}
					}
				}
				else #no description
				{
					if($search_tags)
					{
						if($search_email)
						{
							if($search_tag_list_how == "AND") #OR AND
							{
								#tags, email
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and creator = \"$search_email\" group by ggroup.id having count(ggroup.id)=$number_of_tags";
							}
							else #OR OR
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag,tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") and creator = \"$search_email\" group by ggroup.id";
							}
						}
						else
						{
							if($search_tag_list_how == "AND") #OR AND
							{
								#tags
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag, tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") group by ggroup.id having count(ggroup.id)=$number_of_tags";
							}
							else #OR OR
							{
								$query = "select ggroup.id,group_name,description,date,creator from ggroup, group_tag, tag where visibility = 'public' and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id and tag in (\"$tag_list\") group by ggroup.id";
							}
						}
					}
					else #no tags
					{
						if($search_email)
						{
							#email
							$query = "select ggroup.id,group_name,description,date,creator from ggroup where visibility = 'public' and creator like \"$search_email\" order by downloads desc, date desc, group_name, description";
						}
						else
						{
							#no search terms entered, do the default
							$query = "select ggroup.id,group_name,description,date,creator from ggroup where visibility = 'public' order by downloads desc,date desc, group_name, description";
						}
					}
				}
			}
		}	
		return $query;
	}

	/**
	 * Parses a String of Tags
	 *
	 * Tags are space delimited. Either single or double quotes mark a phrase.
	 * Odd quotes will cause everything on their right to reflect as one single
	 * tag or phrase. All white-space within a phrase is converted to single
	 * space characters. Quotes burried within tags are ignored! Duplicate tags
	 * are ignored, even duplicate phrases that are equivalent.
	 *
	 * Returns an array of tags.
	 */
	function ParseTagString($sTagString)
	{
		$arTags = array();		// Array of Output
		$cPhraseQuote = null;	// Record of the quote that opened the current phrase
		$sPhrase = null;		// Temp storage for the current phrase we are building
		
		// Define some constants
		static $sTokens = " \r\n\t";	// Space, Return, Newline, Tab
		static $sQuotes = "'\"";		// Single and Double Quotes
		
		// Start the State Machine
		do
		{
			// Get the next token, which may be the first
			$sToken = isset($sToken)? strtok($sTokens) : strtok($sTagString, $sTokens);
			
			// Are there more tokens?
			if ($sToken === false)
			{
				// Ensure that the last phrase is marked as ended
				$cPhraseQuote = null;
			}
			else
			{		
				// Are we within a phrase or not?
				if ($cPhraseQuote !== null)
				{
					// Will the current token end the phrase?
					if (substr($sToken, -1, 1) === $cPhraseQuote)
					{
						// Trim the last character and add to the current phrase, with a single leading space if necessary
						if (strlen($sToken) > 1) $sPhrase .= ((strlen($sPhrase) > 0)? ' ' : null) . substr($sToken, 0, -1);
						$cPhraseQuote = null;
					}
					else
					{
						// If not, add the token to the phrase, with a single leading space if necessary
						$sPhrase .= ((strlen($sPhrase) > 0)? ' ' : null) . $sToken;
					}
				}
				else
				{
					// Will the current token start a phrase?
					if (strpos($sQuotes, $sToken[0]) !== false)
					{
						// Will the current token end the phrase?
						if ((strlen($sToken) > 1) && ($sToken[0] === substr($sToken, -1, 1)))
						{
							// The current token begins AND ends the phrase, trim the quotes
							$sPhrase = substr($sToken, 1, -1);
						}
						else
						{
							// Remove the leading quote
							$sPhrase = substr($sToken, 1);
							$cPhraseQuote = $sToken[0];
						}
					}
					else
						$sPhrase = $sToken;
				}
			}
			
			// If, at this point, we are not within a phrase, the prepared phrase is complete and can be added to the array
			if (($cPhraseQuote === null) && ($sPhrase != null))
			{
				$sPhrase = strtolower($sPhrase);
				if (!in_array($sPhrase, $arTags)) $arTags[] = $sPhrase;
				$sPhrase = null;
			}
		}
		while ($sToken !== false);	// Stop when we receive FALSE from strtok()
		return $arTags;
	}

	function gene_lists_form ($tag_choice)
	{
		$page = $_REQUEST['page'];
		$limit = $_REQUEST['limit'];
		$search_group_name =$_REQUEST['search_group_name'];
		$search_gene_list = $_REQUEST['search_gene_list'];
		$search_gene_list_how = $_REQUEST['search_gene_list_how'];
		$search_description = $_REQUEST['search_description'];
		$search_tags = $_REQUEST['search_tags'];
		$search_tag_list_how = $_REQUEST['search_tag_list_how'];
		$search_email = $_REQUEST['search_email'];
		$search_tags = stripslashes($search_tags);
		$search_description = stripslashes("$search_description");
		$search_visibility = $_REQUEST["search_visibility"];

		#design query
		if($tag_choice)
		{
			$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_tag,tag where visibility = 'public' and tag.tag = \"$tag_choice\" and tag.id = group_tag.tag_id and group_tag.group_id = ggroup.id order by downloads desc ,date desc, group_name, description";
		}
		else if ($search_group_name or $search_gene_list or $search_description or $search_tags or $search_email)
		{
			$query = create_search_query($search_group_name,$search_gene_list,$search_gene_list_how,$search_description,$search_tags,$search_tag_list_how,$search_email);
		}
		else
		{
			$query = "select ggroup.id,group_name,description,date,creator from ggroup where visibility = 'public' order by downloads desc, date desc, group_name, description";
		}	


		$group_id = array();
		$list_of_group_ids = "''";
		#print "$query<br>\n";
		$numresults = mysql_query($query);
		$numrows = mysql_num_rows($numresults);
		$result = mysql_query($query);
		#for tag cloud
		while($row = mysql_fetch_row($result))
		{
			$group_id[] = $row[0]; #save group_ids for tag_cloud	
		}
		if(count($group_id) > 0)
		{
			$list_of_group_ids = implode(",",$group_id);
		}
		else
		{
			$list_of_group_ids = "''";
		}
		
		#initialize limit, page
		if(!($limit))
		{
			$limit = 10;
		}
		if(!($page))
		{
			$page = 0;
		}
	
	
		$pages = intval($numrows/$limit);	
		if($numrows % $limit)
		{
			$pages++;
		}
		$current = ($page/$limit) + 1; //current page number
		
		if(($pages < 1) || ($pages == 0))
		{
			$total =1;
		}
		else
		{
			$total = $pages;
		}
	
		$first = $page + 1;
		if(!((($page + $limit) / $limit) >= $pages) && $pages != 1)
		{
			$last = $page + $limit;
		}
		else
		{
			$last = $numrows;
		}

		$start = $page*$limit;
		$query = $query." limit $start, $limit";

		#print "$query\n<br>";
		if($numrows > 0)
		{	
			$result = mysql_query($query) or die("Query failed : ".mysql_error());
			print "\n<form action=\"retrieve.php\" method=\"POST\"><table id=\"gene_lists\"><tr><th class=\"checkbox\"><input type=\"checkbox\" name=\"checkall\" onClick=\"checkUncheckAll(this);\"</th><th>Group</th><th>Description</th><th>Date</th><th>Creator</th><th>Tags</th></tr>";
			print("\n<input type=\"hidden\" name=\"action\" value=\"1\">\n");
			while($row = mysql_fetch_row($result))
			{
				$count = count($row);
				$group_id = array_shift($row);
				print "\n<tr><td class='checkbox'><input type=\"checkbox\" name=\"download_list[]\" value=\"$group_id\"></td>";
				foreach ($row as $item)
				{
					if($row[3] == $item)#email address, different format.
					{
						$nickname=preg_replace("/@.*/","",$item);
						print "\n<td class='tag'><a href=\"mailto:$item\">$nickname</a></td>";
					}
					else
					{
						if(strlen($item) > 30)
						{
							print "\n<td class='description'>$item</td>";
						}
						else
						{
							print "\n<td>$item</td>";
						}
						
					}
				}	
					
				#then print the associated tags
				$tag_list = '';
				$query = "select tag from tag,group_tag where group_id = $group_id and group_tag.tag_id = tag.id";
				#print "$query\n<br>";
				$result2 = mysql_query($query) or die("Query failed: ".mysql_error());
				while($row = mysql_fetch_row($result2))
				{
					$temp_tag = $row[0];
					$tag_list = $tag_list."<a href=\"retrieve.php?action=2&tag_choice=$temp_tag&page=0&limit=$limit\">$temp_tag</a>, ";	
				}
				$tag_list = preg_replace("/,\s$/","",$tag_list);
				print "<td class=\"tag\">$tag_list</td>\n";
				print "</tr>\n";
			}
			print "</table>\n";
	
			print "<div class=\"pagenum\">Results $start - ";
			print min($numrows,$start+$limit);
			print " of ";
			print $numrows;
			print "<br>\nResults per page: <a href=\"retrieve.php?action=2&tag_choice=$tag_choice&page=0&limit=10&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_description=$search_description&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email\">10</a> | <a href=\"retrieve.php?action=2&tag_choice=$tag_choice&page=0&limit=50&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_description=$search_description&search_tags=$search_tags&search_email=$search_email\">50</a> | <a href=\"retrieve.php?action=2&tag_choice=$tag_choice&page=0&limit=100&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_description=$search_description&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email\">100</a><br>\n";
			print "\nPage ";
			print $page+1;
			print " of ";
			if($total == 0) { print "1";}
			else { print $total;}
			print ": <a href=\"retrieve.php?action=2&tag_choice=$tag_choice&page=0&limit=10000000000&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_description=$search_description&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email\">all</a>\n";
			if($pages - $page >= 1)
			{
				$next_page = $page + 1;
				print "<a href=\"retrieve.php?action=2&tag_choice=$tag_choice&page=$next_page&limit=$limit&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_description=$search_description&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email\">next</a>\n";
			}
			if($pages < 10)
			{
				for($i = 1; $i <= $pages; $i++)
				{
					$j = $i-1;
					print "<a href=\"retrieve.php?action=2&tag_choice=$tag_choice&page=$j&limit=$limit&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_description=$search_description&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email\">$i</a> ";
				}
			}
			else
			{
				for($i = 0; $i < 10; $i++)
				{
					$j = intval($pages/10) * $i;
					$k = $j+1;
					print "<a href=\"retrieve.php?action=2&tag_choice=$tag_choice&page=$j&limit=$limit&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_description=$search_description&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email\">$k</a> ";
				}
				print "<a href=\"retrieve.php?action=2&tag_choice=$tag_choice&page=";
				print $total-1;
				print "&limit=$limit&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_description=$search_description&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email\">";
				print $total;
				print "</a> ";
			}
			print "</div>";
			print "<input type=\"hidden\" name=\"search_group_name\" value=\"$search_group_name\">";
			print "<input type=\"hidden\" name=\"search_gene_list\" value=\"$search_gene_list\">";
			print "<input type=\"hidden\" name=\"search_gene_list_how\" value=\"$search_gene_list_how\">";
			print "<input type=\"hidden\" name=\"search_description\" value=\"$search_description\">";
			print "<input type=\"hidden\" name=\"search_tags\" value=\"$search_tags\">";
			print "<input type=\"hidden\" name=\"search_tag_list_how\" value=\"$search_tag_list_how\">";
			print "<input type=\"hidden\" name=\"search_email\" value=\"$search_email\">";
			print "\n<br><input class=\"button\" type=\"Submit\" name=\"Download\" value=\"Download\"></form>\n";
		}
		else
		{	
			print "<div class=\"no_results\">There were no results.</div>";
			#maybe tailor this message to whatever there were no results for.
		}	
		#tag cloud

		$tags = array();
		#print "$list_of_group_ids\n<br>";
		$query = "SELECT tag as t, count(*) as count from tag,group_tag where group_id in ($list_of_group_ids) and tag_id = tag.id group by tag order by count desc limit 40";
    		$result3 = mysql_query($query) or die("Query failed : " . mysql_error());
		while($row = mysql_fetch_assoc($result3))
		{
			extract($row); #creates $t! pretty neat.
			$tag_count = $count;

			#if($tag_count > 1) #why?
			#{
				$tag[tag_name] = $t;
				$tag[tag_count] = $tag_count;
				$tag[tag_class] = '';	
				$tags[] = $tag;
			#}
		}
		#get tag cloud
		$new_tags = cloud_tags($tags);	
	
		#print tag cloud - this is pretty awesome.
		if($new_tags)
		{
			print "<div class=\"tagcloud\">";
			foreach($new_tags as $tag)
			{
				print "<a class=\"$tag[tag_class]\" href=\"retrieve.php?action=2&tag_choice=$tag[tag_name]&limit=$limit\">$tag[tag_name]</a>&nbsp;&nbsp ";
			}
			print "</div>";
		}
		$link = "Download all public groups: <a href='groups_iGA.txt'>iGA</a> <a href='groups_Catmap.txt'>Catmap</a> <a href='groups_GSEA.txt'>GSEA</a>";
		print "<br>$link<br>";
		print "</div>";
		html_end();
	}
	
	/****************************************************************************************/
	// Sorts a list of tags by their count ascending.

	function tag_asort($tag1, $tag2)
	{
	   if($tag1[tag_count] == $tag2[tag_count])
	   {
	       return 0;
	   }
	   return ($tag1[tag_count] < $tag2[tag_count]) ? -1 : 1;
	}

	/****************************************************************************************/
	// Sorts a list of tags alphabetically by tag_name

	function tag_alphasort($tag1, $tag2)
	{
	   if($tag1[tag_name] == $tag2[tag_name])
	   {
	       return 0;
	   }
	   if( strcasecmp($tag1[tag_name],$tag2[tag_name]) < 0)
	   {	
		//return $tag1[tag_name];
		return -1;
	   }
	   else
	   {
		//return $tag2[tag_name];
		return 1;
	   }
	}

	/****************************************************************************************/
	// Assigns classes to each given tag.

	function cloud_tags($tags)
	{
		$tag_sizes = 7;

		usort($tags, "tag_asort");
		if(count($tags) > 0)
		{
			// Start with the sorted list of tags and divide by the number of font sizes (buckets).
			// Then proceed to put an even number of tags into each bucket.  The only restriction is
			// that tags of the same count can't span 2 buckets, so some buckets may have more tags
			// than others.  Because of this, the sorted list of remaining tags is divided by the
			// remaining 'buckets' to evenly distribute the remainder of the tags and to fill as
			// many 'buckets' as possible up to the largest font size.

			$total_tags = count($tags);
			$min_tags = $total_tags / $tag_sizes;

			$bucket_count = 1;
			$bucket_items = 0;
			$tags_set = 0;
			foreach($tags as $key => $tag)
			{
				$tag_count = $tag[tag_count];

				// If we've met the minimum number of tags for this class and the current tag
				// does not equal the last tag, we can proceed to the next class.

				if(($bucket_items >= $min_tags) and $last_count != $tag_count and $bucket_count < $tag_sizes)
				{
					$bucket_count++;
					$bucket_items = 0;

					// Calculate a new minimum number of tags for the remaining classes.

					$remaining_tags = $total_tags - $tags_set;
					$min_tags = $remaining_tags / $bucket_count;
				}

				// Set the tag to the current class.

				$tags[$key][tag_class] = 'tag'.$bucket_count;
				$bucket_items++;
				$tags_set++;

				$last_count = $tag_count;
			}
			usort($tags, 'tag_alphasort');
		}
		return $tags;
	}


#MAIN SECTION
        switch($action)
        {
        case INITIAL_PAGE:
                html_begin("Download Gene Groups","", "gene groups database");
                gene_lists_form('');
                break;
	case FORMAT:
		html_begin("Select Format","","gene groups database");
		$db = db_connect();
		download_format();
		break;
	case SEARCH:
		$search_visibility = $_REQUEST["search_visibility"];
		if ($search_visibility == 'private')
		{
			$search_group_name =$_REQUEST['search_group_name'];
			$search_gene_list = $_REQUEST['search_gene_list'];
			$search_gene_list_how = $_REQUEST['search_gene_list_how'];
			$search_description = $_REQUEST['search_description'];
			$search_tags = $_REQUEST['search_tags'];
			$search_tag_list_how = $_REQUEST['search_tag_list_how'];
			$search_email = $_REQUEST['search_email'];
			$search_tags = stripslashes($search_tags);
			$search_description = stripslashes("$search_description");

			$to = "my_groups.php?&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email&search_visibility=$search_visibility";
    			header('Location: '. $to); 
		}
		else
		{
			html_begin("Search","","gene groups database");
			$db = db_connect();
			find_form();
			print "</div>";
			html_end();
		}
		break;
	case TAG:
		html_begin("Tag","","gene groups database");
		$db = db_connect();
		gene_lists_form($tag_choice);
		break;
        default:
		$search_visibility = $_REQUEST["search_visibility"];
		if ($search_visibility == 'private')
		{
			$search_group_name =$_REQUEST['search_group_name'];
			$search_gene_list = $_REQUEST['search_gene_list'];
			$search_gene_list_how = $_REQUEST['search_gene_list_how'];
			$search_description = $_REQUEST['search_description'];
			$search_tags = $_REQUEST['search_tags'];
			$search_tag_list_how = $_REQUEST['search_tag_list_how'];
			$search_email = $_REQUEST['search_email'];
			$search_tags = stripslashes($search_tags);
			$search_description = stripslashes("$search_description");

			$to = "my_groups.php?&search_group_name=$search_group_name&search_gene_list=$search_gene_list&search_gene_list_how=$search_gene_list_how&search_tags=$search_tags&search_tag_list_how=$search_tag_list_how&search_email=$search_email&search_visibility=$search_visibility";
    			header('Location: '. $to); 
		}
		else
		{
			html_begin("Download Gene Groups","", "gene groups database");
			$db = db_connect();
			gene_lists_form('');
		}
                break;
        }

?>

