<?php
/* see /modeling/includes/team-common.sql for database schema */

# set this to false to allow this script to work on build.eclipse for database admin
$disabled = true;

require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon());

if (!function_exists("internalUseOnly"))
{
		print "Script disabled: see /modeling/\$projectName/project-info/teamAdmin.php."; exit;
}
internalUseOnly();

include($_SERVER["DOCUMENT_ROOT"] . "/modeling/includes/db.php");

ob_start();

$data = "";
$projct = preg_replace("#.+/#","",$PR);

$existingGroups = array();
if (isset($_GET["groups"]) && $_GET["groups"])
{
	foreach ($_GET["groups"] as $gr)
	{
		$existingGroups[] = $gr;
	}
	
}

if (isset($_GET["did"]))
{
	$query = "SELECT groupname FROM teams WHERE did = ".$_GET["did"];  
	$result = wmysql_query($query);
	while ($row = mysql_fetch_row($result))
	{
		$existingGroups[] = $row[0];
	}
}

$query = "SELECT did,name FROM developers ORDER BY SUBSTRING_INDEX(Name,' ',-1)"; // by last name
$result = wmysql_query($query);
$dids = array();
if ($result)
{
	$data .= '<p><select size="8" name="did" onchange="document.location.href=\'?did=\' + this.options[this.selectedIndex].value">'."\n";
	while ($row = mysql_fetch_row($result))
	{
		$data .= "<option " . (isset($_GET["did"]) && $_GET["did"]===$row[0] ? "selected ":"") . "value=\"".$row[0]."\">".$row[1]."</option>\n";
		$dids[$row[0]] = $row[1];
	}
	$data .= '</select></p>'."\n";
} 
else
{
	$data .= "<pre>Error: could not connect to database!\n";
	$data .= "\nQuery was:\n\n$query</pre>\n";
}

$query = "SELECT groupname,path FROM groups" .
		($projct != "modeling" ? " WHERE " . ($projct == "emft" ? "groupname like 'emft%' OR project like '%emft'" : "project LIKE '%$projct' ") . " OR " . "project like '%modeling'" : "") .
		" ORDER BY groupname,path";
$result = wmysql_query($query);
$groups = array();
if ($result)
{
	$data .= '<p><select size="12" multiple="multiple" name="groups[]">'."\n";
	while ($row = mysql_fetch_row($result))
	{
		$data .= "<option " . (isset($_GET["groups"]) && in_array($row[0],$_GET["groups"]) ? "selected ":"") . "value=\"".$row[0]."\">[".(in_array($row[0],$existingGroups) ? "x" : " ")."] ".$row[0]." : ".$row[1]."</option>\n";
		$groups[] = $row[0];
	}
	$data .= '</select></p>'."\n";
} 
else
{
	$data .= "<pre>Error: could not connect to database!\n";
	$data .= "\nQuery was:\n\n$query</pre>\n";
}

$groupnames = null;
if (isset($_GET["groups"]) && $_GET["groups"])
{
	foreach ($_GET["groups"] as $gr)
	{
		if (in_array($gr, $groups))
		{
			$groupnames[] = $gr;
		}
	}
}
$userid = isset($_GET["did"]) && $_GET["did"] && in_array($_GET["did"], array_keys($dids))? $_GET["did"] : null;

if ($disabled)
{
	print "<blockquote><b style=\"color:red\">Not authorized to alter database. Contact codeslave{at}ca{dot}ibm{com}.</b></blockquote>";
} 
else if ($groupnames && $userid) // page two 
{
	foreach ($groupnames as $groupname)
	{
		$query = "INSERT INTO teams (groupname,did) VALUES ('$groupname', $userid)";
		$result = wmysql_query($query);
		if (mysql_affected_rows($connect)>0)
		{
			print "User ".$dids[$userid]." added to group '$groupname'.<br/>";
		}
		else
		{
			#$data .= "<pre>Error: could not insert data into database: ".mysql_error($connect)."!\n";
			#$data .= "\nQuery was:\n\n$query</pre>\n";
		}
	}
}

$pageTitle = "Developer Group Administration";
print <<<EOHTML
<div id="maincontent">
	<div id="midcolumn">
		<h1>$pageTitle</h1>

<p>To associate a developer with a given group, select a developer's name and one or more groups and hit Submit.</p>
<form name="teamAdmin" method="get">
$data
<input type="submit"/>
</form>
	</div>
</div>

<!-- <div id="rightcolumn">
	<div class="sideitem">
		<h6>Add Yourself</h6>
		<p>Not on this list? Attach your details and a photo (or URL) to <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182613">bug 182613</a>.</p>
	</div>
</div> -->
EOHTML;

$html = ob_get_contents();
ob_end_clean();

$pageTitle = "Modeling - " . ($projectName ? $projectName . " -" : "") . " Meet The Team";
$pageKeywords = "";
$pageAuthor = "Nick Boldt";

$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="http://' . ($isBuildServer ? $_SERVER["SERVER_NAME"] : "www.eclipse.org") . '/modeling/includes/downloads.css"/>' . "\n");
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);

?>
