/*
 *	aegis - project change supervisor
 *	Copyright (C) 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/>.
 */

auto pn, p;
pn = project_name();
p = project[pn];
auto ps, cs;
ps = p.state;
auto ph, when, n, max, href;

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

auto t, month, year;
if (count(arg) > 0)
    t = mktime(arg[0]);
else
    t = now();
month = 0 + strftime("%m", t);
year = 0 + strftime("%Y", t);

auto cmap;
cmap =
{
    chain			= "255+0+0";
    internal_bug		= "255+255+0";
    internal_enhancement	= "0+255+0";
    internal_improvement	= "0+255+255";
    external_bug		= "192+192+0";
    external_enhancement	= "0+192+0";
    external_improvement	= "0+192+192";
};

columns({width = 1000; });
print("Content-Type: text/html");
print("");
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\"> "
	## "tr.even-group { background-color: #CCCCCC; } "
	## "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, bn;
depth=0;
stack[depth] = project[pn].state.name;
while ("" != ( bn = project[stack[depth]].state.parent_name )) {
  stack[++depth] = bn;
}
while ( depth >= 0) {
    print("<link rel=\"stylesheet\" type=\"text/css\" href=\"/" ##
      stack[depth--] ## ".css\" " ## "media=\"all\">");
}
print("<title>");
print("Project " ## quote_html(pn) ## ", Change Cause Histogram");
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;,<br>";
/* HTTP limits lines to 510 characters */
for (j in wrap(long_project_name, 510))
    print(j);

href = script_name ## "?file@proj_cch1+project@" ## quote_url(pn);
print("Change Cause <a href=\"" ## href ## "\">Histogram</a><br>");
print(strftime("%B", t));
href = script_name ## "?file@proj_cch2+project@" ## quote_url(pn)
        ## "+" ## year;
print("<a href=\"" ## href ## "\">" ## strftime("%Y", t) ## "</a>");
print("</h1>");
print("<div class=\"information\">");

auto earliest_mday, latest_mday;

auto bucket, mday, last_mday;
bucket = {};
for (ph in ps.branch.history)
{
    cs = ps.branch.change[ph.change_number];
    when = cs.history[count(cs.history) - 1].when;
    if (year != 0 + strftime("%Y", when))
       	continue;
    if (month != 0 + strftime("%m", when))
       	continue;
    mday = 0 + strftime("%d", when);
    if (typeof(bucket[mday]) == "nul")
       	bucket[mday] = {};
    bucket[mday][cs.cause]++;
    bucket[mday].Total++;
}

max = 1;
for (mday in keys(bucket))
{
    n = 0 + bucket[mday].Total;
    if (n > max)
       	max = n;
}
max = 400. / max;

last_mday = 28;
for (n = 28; n < 32; ++n)
{
    when = mktime(strftime("1-%b-%Y 00:00:00", t));
    when += (n - 1) * (24 * 60 * 60);
    if (strftime("%m", when) + 0 != month)
       	break;
    last_mday = n;
}

auto clr;
print("<table align=center>");
print("<tr><th>Day</th><th>Count</th></tr>");
for (mday = 1; mday <= last_mday; ++mday)
{
    if (typeof(bucket[mday]) == "nul")
       	bucket[mday] = {};
    n = 0 + bucket[mday].Total;
    print("<tr><td valign=top align=right>");
    print(mday);
    print("</td><td valign=top align=right>");
    print(n);
    print("</td><td valign=top>");
    auto cause;
    for (cause in [chain,
       	internal_bug, internal_enhancement, internal_improvement,
       	external_bug, external_enhancement, external_improvement])
    {
       	n = 0 + bucket[mday][cause];
       	if (n > 0)
       	{
	    clr = cmap[cause];
	    n = round(n * max);
	    if (n < 3)
		n = 3;
	    href = script_name ## "?file@rect+" ## n ## "+12";
	    href ##= "+color+" ## clr;
	    print("<img src=\"" ## href ## "\" width="##n## " height=12>");
       	}
    }
    print("</td></tr>");
}
print("</table>");
print("</div>");
print("<hr>");

print("<div class=\"legend\">");
print("<h2 align=center>Legend</h2>");
print("This table associates each color in the above graph with");
print("a change cause.  A brief description of each cause is");
print("also given.");
print("<table align=center>");
print("<tr><th>Color</th><th>Cause</th><th>Description</th></tr>");

clr = cmap[chain];
href = script_name ## "?file@rect+50+12+color+" ## clr;
print("<tr><td valign=top>");
print("<img src=\""##href##"\" width=50 height=12>");
print("</td><td valign=top align=center>");
print("chain");
print("</td><td valign=top>");
print("This cause is used for bugs introduced by previous changes.");
print("This is a special case of the <dfn>internal_bug</dfn> cause.");
print("</td></tr>");

clr = cmap[internal_bug];
href = script_name ## "?file@rect+50+12+color+" ## clr;
print("<tr><td valign=top>");
print("<img src=\""##href##"\" width=50 height=12>");
print("</td><td valign=top align=center>");
print("internal_bug");
print("</td><td valign=top>");
print("This cause is used for bugs found by the development team, or by");
print("the development organization.");
print("</td></tr>");

clr = cmap[internal_enhancement];
href = script_name ## "?file@rect+50+12+color+" ## clr;
print("<tr><td valign=top>");
print("<img src=\""##href##"\" width=50 height=12>");
print("</td><td valign=top align=center>");
print("internal_enhancement");
print("</td><td valign=top>");
print("This cause is used for new functionality requested by the");
print("development team, or by the development organization.");
print("</td></tr>");

clr = cmap[internal_improvement];
href = script_name ## "?file@rect+50+12+color+" ## clr;
print("<tr><td valign=top>");
print("<img src=\""##href##"\" width=50 height=12>");
print("</td><td valign=top align=center>");
print("internal_improvement");
print("</td><td valign=top>");
print("This cause is used for improvement to existing functionality");
print("(e.g. performance) requested by the development team, or by the");
print("development organization.");
print("</td></tr>");

clr = cmap[external_bug];
href = script_name ## "?file@rect+50+12+color+" ## clr;
print("<tr><td valign=top>");
print("<img src=\""##href##"\" width=50 height=12>");
print("</td><td valign=top align=center>");
print("external_bug");
print("</td><td valign=top>");
print("This cause is used for bugs found by the customer, or by a source");
print("outside the development organization.");
print("</td></tr>");

clr = cmap[external_enhancement];
href = script_name ## "?file@rect+50+12+color+" ## clr;
print("<tr><td valign=top>");
print("<img src=\""##href##"\" width=50 height=12>");
print("</td><td valign=top align=center>");
print("external_enhancement");
print("</td><td valign=top>");
print("This cause is used for new functionality requested by the customer,");
print("or by a source outside the development organization.");
print("</td></tr>");

clr = cmap[external_improvement];
href = script_name ## "?file@rect+50+12+color+" ## clr;
print("<tr><td valign=top>");
print("<img src=\""##href##"\" width=50 height=12>");
print("</td><td valign=top align=center>");
print("external_improvement");
print("</td><td valign=top>");
print("This cause is used for improvement to existing functionality");
print("(e.g. performance) requested by the customer, or a source outside");
print("the development development organization.");
print("</td></tr>");

print("</table>");
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> |");
href = script_name ## "?file@proj_cch1+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Project Histogram</a> |");
href = script_name ## "?file@proj_cch2+project@" ## quote_url(pn) ## "+"
	## year;
print("<a href=\"" ## href ## "\">Year Histogram</a>");
print("]</p>");

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