<?php
/* path, project's downloads path, downloads page path, includes path, and vanity name */
$PR = substr($projDetails[0],1); 
$projectDownloadsPath = $projDetails[0];
$projectDownloadsPagePath = $projDetails[1];
$projectIncludesPath = $projDetails[2];
$projectName = $projDetails[3];

$isWWWserver = (preg_match("/^(?:www.|)eclipse.org$/", $_SERVER["SERVER_NAME"]));
$isBuildServer = preg_match("/^(build|emft).eclipse.org$/", $_SERVER["SERVER_NAME"]) || preg_match("/^emf(?:\.torolab\.ibm\.com)$/", $_SERVER["SERVER_NAME"]);
$doPhoenix = is_file($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");

if ($isWWWserver || $doPhoenix)
{
	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();
	if (is_file($App->getProjectCommon()))
	{
		include ($App->getProjectCommon());
	}
	$PWD = $App->getDownloadBasePath() . "/$PR/";
	$jdPWD = "http://download.eclipse.org/$PR/";
}
else
{
	if (is_dir("../../../../$PR/"))
	{
		$PWD = "../../../../$PR/"; // in a javadoc folder in the /modeling/mdt area
	}
	else
		if (is_dir("../../../$PR/"))
		{
			$PWD = "../../../$PR/"; // in the web folder in /modeling/mdt/
		}
	$jdPWD = $PWD;
}

$subprojs = loadSubDirs($PWD, "(.+)");

// REDIRECT to latest version of javadoc for the specified path
if ($_GET["project"] && $_GET["page"])
{
	/* http://www.eclipse.org/modeling/emf/javadoc/?project=emf&page=org/eclipse/emf/ecore/package-summary.html&anchor=details
	 * http://www.eclipse.org/modeling/mdt/javadoc/?project=xsd&page=org/eclipse/xsd/package-summary.html&anchor=details */
	$vers = array ();
	foreach ($subprojs as $projct)
	{
		if ($_GET["project"]==$projct)
		{
			$vers = loadSubDirs($PWD . $projct . "/javadoc", "(\d\.\d|\d\.\d\.\d+)");
			break;
		}
	}
	if (sizeof($vers) > 0)
	{
		rsort($vers);
		$redirect = "Location: " . $jdPWD . $projct . "/javadoc/" . $vers[0] . "/" . str_replace("//", "/", str_replace("..", "", $_GET["page"]) . "#" . $_GET["anchor"]);
		//print $redirect;
		header($redirect);
		exit;
	}
}

if ($doPhoenix)
{
	ob_start();
}
else
{
	print '<html>' . "\n" .
	'<head>' . "\n" .
	'  <title>' . $projectName . ' Javadoc</title>' . "\n" .
	'  <link rel="stylesheet" type="text/css" href="http://' . ($isBuildServer ? $_SERVER["SERVER_NAME"] : "www.eclipse.org") . '/modeling/includes/downloads.css"/>' . "\n" .
	'</head>' . "\n" .
	'<body>' . "\n";
}

print '<div id="midcolumn">
<div class="homeitem3col">
<h3>' . $projectName . ' Javadoc</h3>
<ul>
';

$trans = array(); // flipped $projects array
if (sizeof($subprojs) > 0)
{
	sort($subprojs);
	reset($subprojs);
	if (isset ($projects) && is_array($projects))
	{
		$trans = array_flip($projects);
	}
	foreach ($subprojs as $subproj)
	{
		if (in_array($subproj, $projects))
		{
			$label = $trans ? $trans[$subproj] : $subproj;

			$didprint = 0;
			print '<li><b> ' . $label . '</b><a name="' . $subproj . '"></a>' . "\n";
			if ($PR == "modeling/mdt" && $subproj == "xsd")
			{ 
			    $didprint = 1;
			    print '<ul><li><i><a href="/modeling/emf/javadoc/">See EMF Javadoc</a>.</i></li></ul>';
			}
			else
			{
    			$vers = loadSubDirs("$PWD$subproj/javadoc", "");
    			rsort($vers);
    			reset($vers);
			    foreach ($vers as $ver)
    			{
    				if (preg_match("/[^0-9.]+/", $ver))
    				{
    					$vers2 = loadSubDirs("$PWD$subproj/javadoc/" . $ver, "");
    					rsort($vers2);
    					reset($vers2);
    					if (sizeof($vers2) > 0)
    					{
    						$didprint = 1;
    						print "<ul>\n";
    					}
    					foreach ($vers2 as $ver2)
    					{
    						print '<li><a href="' . $jdPWD . $subproj . '/javadoc/' . $ver . '/' . $ver2 . '/">' . $ver . ' ' . $ver2 . '</a></li>' . "\n";
    					}
    					if (sizeof($vers2) > 0)
    					{
    						print "</ul>\n";
    					}
    				}
    				else
    				{
    					$didprint = 1;
    					print '<ul><li><a href="' . $jdPWD . $subproj . '/javadoc/' . $ver . '/">' . $subproj . ' ' . $ver . '</a></li></ul>' . "\n";
    				}
    			}
    			if ($didprint == 0)
    			{
    				print "<ul><li><i>None available.</i></li></ul>";
    			}
			}
			print '</li>' . "\n";
		}
	}
}
else
{
	print "<li>No javadoc found!</li>";
}
print "</ul>\n";
print "</div></div>\n";

$tprojs = loadSubDirs("../../", ".*");
if ($tprojs && sizeof($tprojs) > 0)
{
	sort($tprojs); reset($tprojs);
	print "<div id=\"rightcolumn\">\n";
	print '<div class="sideitem">'."\n". "<h6>Online Javadoc</h6>";
	print '<ul>'."\n";
	foreach ($tprojs as $tproj)
	{
		$sprojs = loadSubDirs($PWD . "/../../modeling/" . $tproj, ".*");
		if ($sprojs && sizeof($sprojs) > 0 && is_dir("../../$tproj/javadoc/"))
		{
			print '<li><a href="/modeling/'.$tproj.'/javadoc/">' . strtoupper($tproj) . "</a></li>\n";
			sort($sprojs); reset($sprojs);
			print '<ul>'."\n";
			foreach ($sprojs as $sproj)
			{
				if (is_dir($PWD . "/../../modeling/" . $tproj . "/" . $sproj . "/javadoc") && !is_link($PWD . "/../../modeling/" . $tproj . "/" . $sproj))
				{
					print '<li><a href="/modeling/'.$tproj.'/javadoc/#' . $sproj . '">' . $sproj . "</a></li>\n";
				}
			}
			print '</ul>'."\n";
		}
	}
	print "</ul>\n";
	print "</div></div>\n";
}

if ($doPhoenix)
{
	$html = ob_get_contents();
	ob_end_clean();

	$pageTitle = "Modeling - " . ($projectName ? $projectName . " -" : "") . " Javadoc";
	$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);
}
else
{
	print "</body></html>\n";
}

function loadSubDirs($dir, $ext)
{
	$stuff = array ();

	if (is_dir($dir) && is_readable($dir))
	{
		$handle = opendir($dir);
		while (($file = readdir($handle)) !== false)
		{
			if (preg_match("/$ext$/", $file) && !preg_match("/^\.{1,2}$/", $file) && is_dir("$dir/$file"))
			{
				$stuff[] = $file;

			}
		}
		closedir($handle);
	}

	return $stuff;
}
?>