/*
 *	aegis - project change supervisor
 *	Copyright (C) 2000, 2002, 2003 Peter Miller;
 *	All rights reserved.
 *
 *	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 2 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, write to the Free Software
 *	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
 *
 * MANIFEST: report the project progress in a month
 */

auto pn, p;
pn = project_name();
auto ps, cs;
ps = project[pn].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 color_map;
color_map =
{
    new_change = "128+128+128";
    develop_begin = "0+0+255";
    develop_begin_undo = "0+95+95";
    develop_end = "128+128+255";
    develop_end_2ar = "96+96+255";
    develop_end_2ai = "160+160+255";
    develop_end_undo = "0+255+255";
    review_begin = "255+192+0";
    review_begin_undo = "255+128+0";
    review_pass = "255+255+0";
    review_pass_undo = "192+255+64";
    review_fail = "255+0+0";
    integrate_begin = "0+128+0";
    integrate_begin_undo = "0+128+128";
    integrate_fail = "255+0+255";
    integrate_pass = "0+255+0";
};

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) ## ", Progress 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 = "``" ## long_project_name ## "'',<br>";
/* HTTP limits lines to 510 characters */
for (j in wrap(long_project_name, 510))
    print(j);

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

/* **********  Scan the Changes in this Branch  ************************* */

auto bucket, mday, hist, clr;
bucket = {};
bucket.total = {};
for (ph in ps.branch.history)
{
    cs = ps.branch.change[ph.change_number];
    for (hist in cs.history)
    {
       	when = hist.when;
       	if (year != strftime("%Y", when))
	    continue;
       	if (month != strftime("%m", when))
	    continue;
       	mday = 0 + strftime("%d", when);
       	if (count(bucket[hist.what]) == 0)
	    bucket[hist.what] = {};
       	bucket[hist.what][mday]++;
	bucket.total[mday]++;
    }
}

max = 1;
for (mday = 1; mday <= 31; ++mday)
{
    n = 0 + bucket.total[mday];
    if (n > max)
       	max = n;
}
max = 400. / max;

auto last_mday;
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;
}

/* **********  Print the Histogram  ************************************* */

print("<table align=center>");
print("<tr><th>Day</th><th>Count</th></tr>");
for (mday = 1; mday <= last_mday; ++mday)
{
    n = 0 + bucket.total[mday];
    print("<tr><td align=right>");
    print(mday);
    print("</td><td align=right>");
    print(n);
    print("</td><td>");
    for (hist in [new_change, develop_begin, develop_begin_undo,
       	develop_end, develop_end_undo, review_pass, review_pass_undo,
       	review_fail, integrate_begin, integrate_begin_undo,
       	integrate_fail, integrate_pass]
    )
    {
       	clr = color_map[hist];
       	n = bucket[hist][mday];
       	if (n > 0)
       	{
	    n = round(n * max);
	    if (n < 3)
	     	n = 3;
	    href = script_name ## "?file@rect+" ## n
	     	## "+12+color+"## clr;
	    print("<img src=\"" ## href ## "\" width="##n##" height=12>");
       	}
    }
    print("</td></tr>");
}
print("</table>");
print("</div>");

/* **********  Legend  ************************************************** */

print("<hr>");
print("<div class=\"legend\">");
print("<h2 align=center>Legend</h2>");

print("<table align=center>");
for (hist in [new_change, develop_begin, develop_begin_undo, develop_end,
    develop_end_2ar, develop_end_2ai, develop_end_undo, review_begin,
    review_begin_undo, review_pass, review_pass_undo,  review_fail,
    integrate_begin, integrate_begin_undo, integrate_fail,
    integrate_pass]
)
{
    clr = color_map[hist];
    print("<tr><td valign=top align=center>");
    href = script_name ## "?file@rect+30+12+color+" ## clr;
    print("<img src=\"" ## href ## "\" width=30 height=12>");
    print("</td><td valign=top>");
    print(hist);
    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_prgr1+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Project Progress</a> |");
href = script_name ## "?file@proj_prgr2+project@" ## quote_url(pn) ## "+"
	## year;
print("<a href=\"" ## href ## "\">Year Progress</a>");
print("]</p>");

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