/*
 *	aegis - project change supervisor
 *	Copyright (C) 1997, 1998, 2002, 2003, 2005-2008 Peter Miller
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 3 of the License, or
 *	(at your option) any later version.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 *	You should have received a copy of the GNU General Public License
 *	along with this program. If not, see
 *	<http://www.gnu.org/licenses/>.
 */

columns({width = 1000; });
print("Content-Type: text/html");
print("");

auto pn, p, cn, c;
pn = project_name();
p = project[pn].state.branch;
cn = change_number();
c = p.change[cn];

auto script_name;
script_name = getenv("SCRIPT_NAME");
if (script_name == "")
	script_name = "http://localhost/cgi-bin/aegis.cgi";

auto href;
href = script_name ## "?file@proj_menu+project@" ## quote_url(pn);

print("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\""
	## "\"http://www.w3.org/TR/REC-html40/loose.dtd\">");
print("<html><head>");
print("<meta name=\"ROBOTS\" content=\"NOINDEX, NOFOLLOW\">");
print("<meta name=\"GENERATOR\" content=\"" ## script_name ## "\">");
print("<meta http-equiv=\"Content-Type\" "
	## "content=\"text/html; charset=ISO-8859-1\">");
print("<style type=\"text/css\"> "
	## "body { background-color: white; } "
	## "</style>");
/*
 * Netscape 4.x has numerous CSS bugs, two of which need mentioning.
 * 1. If a style sheet is not present Netscape says 404 Not found, when
 * it should silently ignore it.  2. Style sheets who's media is not
 * "screen" will be ignored.  Fortunately we can use (2) to get around (1).
 */
print("<link rel=\"stylesheet\" type=\"text/css\" href=\"/aedefault.css\" "
	## "media=\"all\">");
auto stack, depth, n;
depth=0;
stack[depth] = project[pn].state.name;
while ("" != ( n = project[stack[depth]].state.parent_name )) {
  stack[++depth] = n;
}
while ( depth >= 0) {
    print("<link rel=\"stylesheet\" type=\"text/css\" href=\"/" ##
      stack[depth--] ## ".css\" " ## "media=\"all\">");
}
print("<title>");

print("Project " ## quote_html(pn) ## ", Change " ## cn);
print("</title></head><body><h1 align=center>");

print("<a href=\"" ## script_name ## "\">Project</a>");
auto long_project_name;
auto prj_name_parts;
prj_name_parts = split(pn, '.');
href = script_name ## "?file@proj_menu+project@"
	## quote_url(prj_name_parts[0]);
long_project_name = "<a href=\"" ## href ## "\" >"
	## quote_html(prj_name_parts[0]) ## "</a>";
auto j;
for (j = 1; j < count(prj_name_parts); j++)
{
    href ##= '.' ## prj_name_parts[j];
    long_project_name ##= ".<a href=\"" ## href ## "\" >"
    	## quote_html(prj_name_parts[j]) ## "</a>";
};
long_project_name = "&ldquo;" ## long_project_name ## "&rdquo;,";
/* HTTP limits lines to 510 characters */
for (j in wrap(long_project_name, 510))
    print(j);

print("Change " ## cn);
print("</h1>");

print("<div class=\"brief-description\">");
print("<h2>Brief Description</h2>");
auto part;
for (part in wrap_html(quote_html(c.brief_description), 80))
    print(part);
print("</div>");

print("<div class=\"description\">");
print("<h2>Description</h2>");
for (part in wrap_html(quote_html(c.description), 80))
    print(part);
print("</div>");

print("<div class=\"information\">");
print("<h2>Information Available</h2>");
print("<dl>");

auto ok;
try { ok = count(keys(c.branch)); }
catch(ok) { ok = 0; }

print("<dt>State<dd>This change is in the <dfn>" ## c.state ## "</dfn> state.");

if (ok)
{
    print("<p>");
    href = script_name ## "?file@proj_menu+project@" ## quote_url(pn) ## "." ##
	cn;
    print("<dt><a href=\"" ## href ## "\">");
    print("Branch");
    print("</a><dd>");
    print("This change is a branch of the &ldquo;" ## quote_html(pn) ##
	"&rdquo; project.");
    print("This item takes you to a project menu for the");
    print("&ldquo;" ## quote_html(pn) ## "." ## cn ## "&rdquo; branch.");
}

if (c.state >= being_developed)
{
    print("<p>");
    href = script_name ## "?file@file_list+project@" ## quote_url(pn) ##
	"+change@" ## cn;
    print("<dt><a href=\"" ## href ## "\">");
    print("Files");
    print("</a><dd>");
    print("This item will provide you with a listing of files which are");
    print("being created, modified or deleted by this change.");
}

if (c.state >= being_developed && c.state <= being_integrated)
{
    print("<p>");
    href = script_name ## "?file@file_activ+project@" ## quote_url(pn) ##
	"+change@" ## cn;
    print("<dt><a href=\"" ## href ## "\">");
    print("File Activity");
    print("</a><dd>");
    print("This item will provide you with a listing of files which are");
    print("being modified in this change <em>and also</em> in other changes.");
    print("The list includes who is working on the changes, and a brief");
    print("description of each change.");

    print("<p>");
    print("<dt>");
    href = script_name ## "?file@file_cflct";
    href ##= "+project@" ## quote_url(pn);
    href ##= "+change@" ## cn;
    print("<a href=\"" ## href ## "\">File Conflict</a>");
    print("<dd>");
    print("This item will provide you with a list of changes which are");
    print("actively modifying files in common with this change");
    print("<strong>if</strong> more than <em>one</em> change is modifying the");
    print("file at the same time.");
}

if (c.state >= being_developed)
{
    print("<p>");
    href = script_name ## "?file@file_hstry+project@" ## quote_url(pn) ##
	"+change@" ## cn;
    print("<dt><a href=\"" ## href ## "\">");
    print("File History");
    print("</a><dd>");
    print("This item will provide you with a listing of all completed");
    print("changes which affected the files in this change.  This report");
    print("can take a long time to generate.");
}

print("<p>");
href = script_name ## "?file@chan_hstry+project@" ## quote_url(pn) ##
    "+change@" ## cn;
print("<dt><a href=\"" ## href ## "\">");
print("History");
print("</a><dd>");
print("This item will provide you with a listing of the state transitions");
print("of this change, when they were performed, and who performed them.");

if (c.state >= being_developed)
{
    print("<p>");
    print("<dt>Download<dd>");
    print("There are three ways to download this change.");
    print("<br><table align=center>");

    print("<tr><td valign=top>");
    href = script_name ## "/" ## quote_url(pn) ## ".C" ## cn
	## ".patch?file@aepatch+project@" ## quote_url(pn)
	## "+change@" ## cn;
    print("<a href=\"" ## href ## "\"><code>patch</code></a>");
    print("</td><td valign=top>");
    print("This link will download a compressed patch familiar to Open");
    print("Source developers.");
    print("Unlike the <i>aedist</i> link, below, the change meta-data");
    print("is not preserved, only the change description endures.");
    print("</td></tr>");

    print("<tr><td valign=top>");
    href = script_name ## "/" ## quote_url(pn) ## ".C" ## cn
	## ".tar.gz?file@aetar+project@" ## quote_url(pn)
	## "+change@" ## cn;
    print("<a href=\"" ## href ## "\"><code>tar.gz</code></a>");
    print("</td><td valign=top>");
    print("This link will download a complete project source tarball up to");
    print("this change.  <strong>Note:</strong> These tarballs do not");
    print("contain derived or generated files.");
    print("Unlike the <i>aedist</i> link, below, the change meta-data");
    print("is not preserved.");
    print("</td></tr>");

    print("<tr><td valign=top>");
    href = script_name ## "/" ## quote_url(pn) ## ".C" ## cn
	## ".ae?file@aedist+project@" ## quote_url(pn)
	## "+change@" ## cn;
    print("<a href=\"" ## href ## "\"><code>aedist</code></a>");
    print("</td><td valign=top>");
    print("The <em>aedist</em>(1) program packages changes so that they");
    print("may be reproduced exactly on the remote site.  Changes packaged in");
    print("this way require the <em>aedist</em>(1) program from");
    print("Aegis 4.23 or later to apply them.");
    print("</td></tr>");

    print("</table>");
}

print("</dl>");
print("</div>");

print("<hr>");
print("<p align=center class=\"navbar\">[");
print("<a href=\"" ## script_name ## "\">Project List</a> |");
href = script_name ## "?file@proj_menu+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Project Menu</a> |");
href = script_name ## "?file@changes+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Change List</a>");
print("]</p>");

print("<hr>");

print("This page was generated " ## now() ## ".");
print("</body></html>");
