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

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

	function check_password()
	{
		if (!isset ($_SESSION)) session_start();
		$username = $_SESSION["session_username"];
		$password = $_SESSION["session_password"];
		if(!isset($_SESSION["session_username"]) or empty($_SESSION["session_username"]) or !isset($_SESSION["session_password"]) or empty($_SESSION["session_password"]))
		{
			#username isn't set. make them login.
			return FALSE;
		}
		else
		{
			#check password
			$query = "select * from user where password like \"$password\" and email like \"$username\"";
			$result = mysql_query($query);
			if(mysql_num_rows($result) != 1) 
			{
				return FALSE;
			}
			else
			{
				return TRUE;
			}
		}
	}
	function login()
	{
		print "Please login below or <a href=\"?action=4\">register</a> to store private groups.<br>";
		print "<p>\n";
		print "<form action=\"?action=5\" method=\"POST\">";
		print "<table class=\"entry\">";

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

		print "<tr>";
		print "<td class=\"entry\" valign=\"top\">Password:</td><td class=\"entry\">";
		print "<input type=\"password\" name=\"password\"><td class=\"annotation\"><a href=\"password.php\">forgot your password?</a></td></tr>\n";
		
		
		print "<tr><td class=\"entry\"></td><td class=\"entry\"><input class=\"button\" type=\"submit\" value=\"Login\" name=\"Login\"></td></tr></table></form>";
		
	}
	function login_finished()
	{
		if (!isset ($_SESSION)) session_start();
		$username = $_REQUEST["username"];
		$password = md5($_REQUEST["password"]);
		$query = "select * from user where email = \"$username\" and password = \"$password\"";
		$result = mysql_query($query);
		if(mysql_num_rows($result) != 1)
		{
			html_begin("Login failed","", "gene groups database");
			print "Login failed.\n<br>";
			login();
		}
		else
		{
			$_SESSION['session_username'] = "$username";	
			$_SESSION['session_password'] = "$password";
			html_begin("My Gene Lists","", "gene groups database");
			gene_lists_form('');
		}
	}
	function register()
	{
		#user registration form.
		print "<form action=\"my_groups.php?action=6\" method=\"POST\">";
		print "Register to store private groups.<p>";	
		print "<table class=\"entry\">";

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

		print "<tr>";
		print "<td class=\"entry\" valign=\"top\">Password:</td><td class=\"entry\">";
		print "<input type=\"password\" name=\"password\"></tr>\n";
		
		print "<tr>";
		print "<td class=\"entry\" valign=\"top\">Verify Password:</td><td class=\"entry\">";
		print "<input type=\"password\" name=\"verify\"></tr>\n";
		
		print "<tr><td class=\"entry\"></td><td class=\"entry\"><input type=\"submit\" value=\"Register\" name=\"Register\"></td></tr>";
	}
	function registered()
	{
		$username = $_REQUEST["username"];
		$password = md5($_REQUEST["password"]);
		$verify = md5($_REQUEST["verify"]);
		
		if($username and $password and $verify)
		{
			if($password === $verify)
			{
				$query = "select * from user where email = \"$username\"";
				$result = mysql_query($query);
				if(mysql_num_rows($result) > 0)
				{
					html_begin("Whoops","gene groups database");
					print "That email address is already registered.<br>\n";
					login();
				}
				else
				{
						
					$query = "insert into user (email,password) values (\"$username\",\"$password\")";
					$result = mysql_query($query) or die($error = "Query failed: ".mysql_error());
					$user_id = mysql_insert_id();
					
					$query = "select id from ggroup where creator = \"$username\"";
					$result = mysql_query($query) or die($error = "Query failed: ".mysql_error());
					while($row = mysql_fetch_row($result))
					{
						$group_id = $row[0];
						$query = "insert into group_user (group_id,user_id) values (\"$group_id\",\"$user_id\")";
						mysql_query($query);
					}
					if (!isset ($_SESSION)) session_start();
					$_SESSION['session_username'] = "$username";
					$_SESSION['session_password'] = "$password";
					html_begin("Thanks for registering","gene groups database");
					#print "$query $error $user_id <br>\n";
					gene_lists_form('');
				}
			}
			else
			{
				html_begin("Password error","gene groups database");
				print "Passwords didn't match. $password_no $verify_no<br>\n";
				register();
			}	
		}
		else
		{
			html_begin("Registration error","gene groups database");
			print "Please enter your email and password (twice) to register.<br>\n";
			register();
		}
	}
	function download_format()
	{
		$list = $_REQUEST["download_list"];
		$groups = $_REQUEST["download_group"];
		$username = $_SESSION["session_username"];
		$password = $_SESSION["session_password"];	
	
		$group_ids = implode(",",$list);
		$query = "select ggroup.id, group_name, description, gene.id, gene_name from ggroup, group_gene, gene, group_user,user where group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" and ggroup.id in ($group_ids) and ggroup.id = group_gene.group_id and group_gene.gene_id = gene.id and ggroup.id = group_user.group_id and group_user.user_id = user.id and user.email = \"$username\" group by gene_name order by ggroup.downloads desc,ggroup.date desc,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[1]][] = $row[4];
			$group_desc[$row[1]] = $row[2];
		}

		print "<h3>Choose a file format</h3>";
		print "<form action=\"download.php\" method=\"POST\"><table class=\"entry\">";
		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 class=\"button\" type=\"Submit\" name=\"Download\" value=\"Download\"></form>";
	}
	function find_form()
	{
                print "<form action=\"my_groups.php?action=2\" method=\"GET\">";
		print "Search by any of the following.<p>";
                print "<table class=\"entry\">";
                print "<tr>";
                print "<td class=\"entry\">Group Name:</td><td class=\"entry\">";
                print "<input type=\"text\" name=\"search_group_name\">";
                
		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 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)
	{
		$username = $_SESSION["session_username"];
		#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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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")
							{
								#gene list
								$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_gene,gene ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" and description like \"%$search_description%\" and creator like $search_email";
						}
						else
						{
							#description
							$query = "select ggroup.id, group_name,description,date,creator from ggroup ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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 ,group_user,user where visibility = 'private' and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" and creator like \"$search_email\" order by downloads desc, date desc, description";
						}
						else
						{
							#no search terms entered, do the default
							$query = "select ggroup.id,group_name,description,date,creator from ggroup order by downloads desc,date desc, 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_email = '';
		$search_tags = stripslashes($search_tags);
		$search_description = stripslashes("$search_description");
		$username = $_SESSION['session_username'];


		#design query
		if($tag_choice)
		{
			$query = "select ggroup.id,group_name,description,date,creator from ggroup,group_tag,tag ,group_user,user where group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" 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, 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,group_user,user where email = \"$username\" and user.id = group_user.user_id and group_user.group_id = ggroup.id order by downloads desc,date desc, description";
		}	

		$group_id = array();
		#print "$query<br>\n";
		$numresults = mysql_query($query);
		$numrows = mysql_num_rows($numresults);
		$result = mysql_query($query);
		#for tag cloud
		while($row = mysql_fetch_assoc($result))
		{
			$group_id[] = $row["id"]; #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=\"my_groups.php\" method=\"POST\"><table id=\"gene_lists\"><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>";
			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,ggroup,group_user,user where group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" and ggroup.id = group_tag.group_id and group_tag.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=\"my_groups.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=\"my_groups.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=\"my_groups.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=$s
earch_tags&search_email=$search_email\">50</a> | <a href=\"my_groups.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=\"my_groups.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=\"my_groups.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=\"my_groups.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=\"my_groups.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=\"my_groups.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=\"pagenum\">There were no results.</div>";
			#maybe tailor this message to whatever there were no results for.
		}	
		#tag cloud
			
		$tags = array();
		$query = "SELECT tag as t, count(*) as count from tag,group_user,user,ggroup,group_tag where group_tag.group_id in ($list_of_group_ids) and group_user.group_id = ggroup.id and group_user.user_id = user.id and email = \"$username\" and ggroup.id = group_tag.group_id and group_tag.tag_id = tag.id group by tag order by count desc limit 40";
		#print "$query\n";
    		$result3 = mysql_query($query) or die("Query failed 1117: " . mysql_error());
		while($row = mysql_fetch_assoc($result3))
		{
			extract($row); #creates $t! pretty neat.
			$tag_count = $count;

			if($tag_count > 1)
			{
				$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=\"my_groups.php?action=2&tag_choice=$tag[tag_name]&limit=$limit\">$tag[tag_name]</a>&nbsp;&nbsp ";
			}
			print "</div>\n";
		}
		print "</div>\n";
		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:
			if(check_password())
			{ 
				html_begin("Download Gene Groups","", "gene groups database");
				gene_lists_form('');
			}
			else 
			{
				html_begin("Login","", "gene groups database");
				login();
				print "</div>\n";
				html_end();
			}
			break;
		case FORMAT:
			$db = db_connect();
			if(check_password())
			{ 
				html_begin("Select Format","gene groups database");
				download_format();
			}
			else 
			{
				html_begin("Login","", "gene groups database");
				login();
				print "</div>\n";
				html_end();
			}
			break;
		case SEARCH:
			$db = db_connect();
			if(check_password())
			{ 
				html_begin("Search","gene groups database");
				find_form();
			}
			else 
			{
				html_begin("Login","", "gene groups database");
				login();
				print "</div>\n";
				html_end();
			}
			break;
		case TAG:
			$db = db_connect();
			if(check_password())
			{
				html_begin("Tag","gene groups database");
				gene_lists_form($tag_choice);
			}
			else 
			{
				html_begin("Login","", "gene groups database");
				login();
				print "</div>\n";
				html_end();
			}
			break;
		case REGISTER:
			$db = db_connect();
			html_begin("Register","gene groups database");
			register();
			print "</div>\n";
			html_end();
			break;
		case REGISTERED:
			$db = db_connect();
			registered();
			break;
		case LOGIN:
			$db = db_connect();
			login_finished();
			break;
		default:
			$db = db_connect();
			if(check_password())
			{
				html_begin("Download Gene Groups","", "gene groups database");
				gene_lists_form('');
			}
			else 
			{
				html_begin("Login","", "gene groups database");
				login();
				print "</div>\n";
				html_end();
			}
			break;
	}
?>

